Skip to content
This repository was archived by the owner on Nov 19, 2023. It is now read-only.

Commit 1929ad3

Browse files
authored
Merge pull request #283 from maticardenas/282-url-schema-loader
feat: adding url schema loader functionality
2 parents ef24951 + dd3dda1 commit 1929ad3

File tree

7 files changed

+224
-166
lines changed

7 files changed

+224
-166
lines changed

openapi_tester/loaders.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from typing import TYPE_CHECKING, cast
1010
from urllib.parse import urlparse
1111

12+
import requests
1213
import yaml
1314
from django.urls import Resolver404, resolve
1415
from django.utils.functional import cached_property
@@ -258,3 +259,28 @@ def load_schema(self) -> dict[str, Any]:
258259
return cast(
259260
"dict", json.loads(content) if ".json" in self.path else yaml.load(content, Loader=yaml.FullLoader)
260261
)
262+
263+
264+
class UrlStaticSchemaLoader(BaseSchemaLoader):
265+
"""
266+
Loads OpenAPI schema from an url static file.
267+
"""
268+
269+
def __init__(self, url: str, field_key_map: dict[str, str] | None = None):
270+
super().__init__(field_key_map=field_key_map)
271+
self.url = url
272+
273+
def load_schema(self) -> dict[str, Any]:
274+
"""
275+
Loads a static OpenAPI schema from url, and parses it to a python dict.
276+
277+
:return: Schema contents as a dict
278+
:raises: ImproperlyConfigured
279+
"""
280+
response = requests.get(self.url, timeout=20)
281+
return cast(
282+
"dict",
283+
json.loads(response.content)
284+
if ".json" in self.url
285+
else yaml.load(response.content, Loader=yaml.FullLoader),
286+
)

openapi_tester/schema_tester.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from typing import TYPE_CHECKING, Any, Callable, cast
66

77
from django.conf import settings
8-
from django.core.exceptions import ImproperlyConfigured
8+
from django.core.exceptions import ImproperlyConfigured, ValidationError
9+
from django.core.validators import URLValidator
910

1011
from openapi_tester.constants import (
1112
INIT_ERROR,
@@ -18,7 +19,12 @@
1819
VALIDATE_WRITE_ONLY_RESPONSE_KEY_ERROR,
1920
)
2021
from openapi_tester.exceptions import DocumentationError, OpenAPISchemaError, UndocumentedSchemaSectionError
21-
from openapi_tester.loaders import DrfSpectacularSchemaLoader, DrfYasgSchemaLoader, StaticSchemaLoader
22+
from openapi_tester.loaders import (
23+
DrfSpectacularSchemaLoader,
24+
DrfYasgSchemaLoader,
25+
StaticSchemaLoader,
26+
UrlStaticSchemaLoader,
27+
)
2228
from openapi_tester.utils import lazy_combinations, normalize_schema_section
2329
from openapi_tester.validators import (
2430
validate_enum,
@@ -46,7 +52,7 @@
4652
class SchemaTester:
4753
"""Schema Tester: this is the base class of the library."""
4854

49-
loader: StaticSchemaLoader | DrfSpectacularSchemaLoader | DrfYasgSchemaLoader
55+
loader: StaticSchemaLoader | DrfSpectacularSchemaLoader | DrfYasgSchemaLoader | UrlStaticSchemaLoader
5056
validators: list[Callable[[dict, Any], str | None]]
5157

5258
def __init__(
@@ -70,7 +76,11 @@ def __init__(
7076
self.validators = validators or []
7177

7278
if schema_file_path is not None:
73-
self.loader = StaticSchemaLoader(schema_file_path, field_key_map=field_key_map)
79+
try:
80+
URLValidator()(schema_file_path)
81+
self.loader = UrlStaticSchemaLoader(schema_file_path, field_key_map=field_key_map)
82+
except ValidationError:
83+
self.loader = StaticSchemaLoader(schema_file_path, field_key_map=field_key_map)
7484
elif "drf_spectacular" in settings.INSTALLED_APPS:
7585
self.loader = DrfSpectacularSchemaLoader(field_key_map=field_key_map)
7686
elif "drf_yasg" in settings.INSTALLED_APPS:

0 commit comments

Comments
 (0)