Skip to content

Commit

Permalink
Remove webhooks parameter from SchemaGenerator and pass settings dire…
Browse files Browse the repository at this point in the history
…ctly
  • Loading branch information
federicobond committed Jan 14, 2024
1 parent eb60530 commit 50c15e7
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 28 deletions.
16 changes: 1 addition & 15 deletions drf_spectacular/generators.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import re

from django.urls import URLPattern, URLResolver
from django.utils.module_loading import import_string
from rest_framework import views, viewsets
from rest_framework.schemas.generators import BaseSchemaGenerator
from rest_framework.schemas.generators import EndpointEnumerator as BaseEndpointEnumerator
Expand Down Expand Up @@ -103,7 +102,6 @@ def __init__(self, *args, **kwargs):
self.registry = ComponentRegistry()
self.api_version = kwargs.pop('api_version', None)
self.inspector = None
self.webhooks = kwargs.pop('webhooks', None)
super().__init__(*args, **kwargs)

def coerce_path(self, path, method, view):
Expand Down Expand Up @@ -185,14 +183,6 @@ def _initialise_endpoints(self):
self.inspector = self.endpoint_inspector_cls(self.patterns, self.urlconf)
self.endpoints = self.inspector.get_api_endpoints()

def _initialise_webhooks(self):
if self.webhooks:
return
if not spectacular_settings.OAS_VERSION.startswith('3.1'):
return
webhooks = spectacular_settings.WEBHOOKS or []
self.webhooks = [import_string(s) for s in webhooks]

def _get_paths_and_endpoints(self):
"""
Generate (path, method, view) given (path, method, callback) for paths.
Expand Down Expand Up @@ -284,17 +274,13 @@ def parse(self, input_request, public):

return result

def get_webhooks(self):
self._initialise_webhooks()
return self.webhooks or []

def get_schema(self, request=None, public=False):
""" Generate a OpenAPI schema. """
reset_generator_stats()
result = build_root_object(
paths=self.parse(request, public),
components=self.registry.build(spectacular_settings.APPEND_COMPONENTS),
webhooks=process_webhooks(self.get_webhooks(), self.registry),
webhooks=process_webhooks(spectacular_settings.WEBHOOKS, self.registry),
version=self.api_version or getattr(request, 'version', None),
)
for hook in spectacular_settings.POSTPROCESSING_HOOKS:
Expand Down
5 changes: 4 additions & 1 deletion drf_spectacular/plumbing.py
Original file line number Diff line number Diff line change
Expand Up @@ -1408,14 +1408,17 @@ def build_serializer_context(view) -> typing.Dict[str, Any]:
return {'request': view.request}


def process_webhooks(webhooks: List[OpenApiWebhook], registry: ComponentRegistry) -> _SchemaType:
def process_webhooks(webhooks: Union[List[OpenApiWebhook], None], registry: ComponentRegistry) -> _SchemaType:
"""
Creates a mocked view for every webhook. The given extend_schema decorator then
specifies the expectations on the receiving end of the callback. Effectively
simulates a sub-schema from the opposing perspective via a virtual view definition.
"""
result = {}

if webhooks is None:
return result

for webhook in webhooks:
if isinstance(webhook.decorator, dict):
methods = webhook.decorator
Expand Down
1 change: 1 addition & 0 deletions drf_spectacular/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@
'AUTHENTICATION_WHITELIST',
'RENDERER_WHITELIST',
'PARSER_WHITELIST',
'WEBHOOKS',
]


Expand Down
4 changes: 2 additions & 2 deletions tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def assert_equal(actual, expected):
assert actual == expected and not diff, diff


def generate_schema(route, viewset=None, view=None, view_function=None, patterns=None, webhooks=None):
def generate_schema(route, viewset=None, view=None, view_function=None, patterns=None):
from django.urls import path
from rest_framework import routers
from rest_framework.viewsets import ViewSetMixin
Expand All @@ -80,7 +80,7 @@ def generate_schema(route, viewset=None, view=None, view_function=None, patterns
else:
assert route is None and isinstance(patterns, list)

generator = SchemaGenerator(patterns=patterns, webhooks=webhooks)
generator = SchemaGenerator(patterns=patterns)
schema = generator.get_schema(request=None, public=True)
validate_schema(schema) # make sure generated schemas are always valid
return schema
Expand Down
12 changes: 2 additions & 10 deletions tests/test_webhooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from drf_spectacular.generators import SchemaGenerator
from drf_spectacular.utils import OpenApiResponse, OpenApiWebhook, extend_schema
from tests import assert_schema, generate_schema
from tests import assert_schema


class EventSerializer(serializers.Serializer):
Expand All @@ -32,17 +32,9 @@ class EventSerializer(serializers.Serializer):
)


@mock.patch('drf_spectacular.settings.spectacular_settings.OAS_VERSION', '3.1.0')
def test_webhooks(no_warnings):
assert_schema(
generate_schema(None, patterns=[], webhooks=[subscription_event]),
'tests/test_webhooks.yml'
)


@pytest.mark.urls(__name__)
@mock.patch('drf_spectacular.settings.spectacular_settings.OAS_VERSION', '3.1.0')
@mock.patch('drf_spectacular.settings.spectacular_settings.WEBHOOKS', ["tests.test_webhooks.subscription_event"])
@mock.patch('drf_spectacular.settings.spectacular_settings.WEBHOOKS', [subscription_event])
def test_webhooks_settings(no_warnings):
assert_schema(
SchemaGenerator().get_schema(request=None, public=True),
Expand Down

0 comments on commit 50c15e7

Please sign in to comment.