Skip to content

Commit 85ef3d8

Browse files
committed
Support basic re_path
1 parent 23a8b57 commit 85ef3d8

File tree

6 files changed

+48
-6
lines changed

6 files changed

+48
-6
lines changed

openapi_core/contrib/django/requests.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ def create(cls, request):
3636
else:
3737
route = cls.path_regex.sub(
3838
r'{\1}', request.resolver_match.route)
39+
# Delete start marker and expression marker to allow concatenation.
40+
if route[:1] == "^":
41+
route = route[1:]
42+
if route[-1:] == "$":
43+
route = route[:-1]
3944
path_pattern = '/' + route
4045

4146
path = request.resolver_match and request.resolver_match.kwargs or {}

tests/integration/contrib/django/data/djangoproject/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
'django.middleware.clickjacking.XFrameOptionsMiddleware',
5151
]
5252

53-
ROOT_URLCONF = 'djangotest.urls'
53+
ROOT_URLCONF = 'djangoproject.urls'
5454

5555
TEMPLATES = [
5656
{

tests/integration/contrib/django/data/djangoproject/testapp/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414

1515
class TestView(APIView):
1616

17-
def get(self, request, pk):
17+
def get(self, request, pk=None):
1818
with open(settings.OPENAPI_SPEC_PATH) as file:
1919
spec_yaml = file.read()
20-
spec_dict = yaml.load(spec_yaml)
20+
spec_dict = yaml.safe_load(spec_yaml)
2121
spec = create_spec(spec_dict)
2222

2323
openapi_request = DjangoOpenAPIRequest(request)

tests/integration/contrib/django/data/djangoproject/urls.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
1515
"""
1616
from django.contrib import admin
17-
from django.urls import include, path
18-
from djangotest.testapp import views
17+
from django.urls import include, path, re_path
18+
from djangoproject.testapp import views
1919

2020
urlpatterns = [
2121
path('admin/', admin.site.urls),
@@ -28,4 +28,5 @@
2828
views.TestView.as_view(),
2929
name='test',
3030
),
31+
re_path(r"^api/test-simple$", views.TestView.as_view()),
3132
]

tests/integration/contrib/django/data/openapi.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,13 @@ paths:
3030
schema:
3131
type: integer
3232
minimum: 1
33+
34+
/api/test-simple:
35+
get:
36+
responses:
37+
'200':
38+
description: Success.
39+
content:
40+
application/json:
41+
schema:
42+
type: object

tests/integration/contrib/test_django.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def django_settings(self):
2020
import django
2121
from django.conf import settings
2222
from django.contrib import admin
23-
from django.urls import path
23+
from django.urls import path, re_path
2424

2525
if settings.configured:
2626
return
@@ -45,6 +45,7 @@ def django_settings(self):
4545
django.setup()
4646
settings.ROOT_URLCONF = (
4747
path('admin/', admin.site.urls),
48+
re_path('test/test-regexp/$', lambda d: None)
4849
)
4950

5051
@pytest.fixture
@@ -139,6 +140,31 @@ def test_url_rule(self, request_factory):
139140
assert openapi_request.body == request.body
140141
assert openapi_request.mimetype == request.content_type
141142

143+
def test_url_regexp_pattern(self, request_factory):
144+
from django.urls import resolve
145+
request = request_factory.get('/test/test-regexp/')
146+
request.resolver_match = resolve('/test/test-regexp/')
147+
148+
openapi_request = DjangoOpenAPIRequest(request)
149+
150+
path = {}
151+
query = {}
152+
headers = {
153+
'Cookie': '',
154+
}
155+
cookies = {}
156+
assert openapi_request.parameters == RequestParameters(
157+
path=path,
158+
query=query,
159+
header=headers,
160+
cookie=cookies,
161+
)
162+
assert openapi_request.method == request.method.lower()
163+
assert openapi_request.full_url_pattern == \
164+
request._current_scheme_host + "/test/test-regexp/"
165+
assert openapi_request.body == request.body
166+
assert openapi_request.mimetype == request.content_type
167+
142168

143169
class TestDjangoOpenAPIResponse(BaseTestDjango):
144170

0 commit comments

Comments
 (0)