Skip to content

Commit cae2f08

Browse files
committed
make DRF dependency optional
1 parent 98e4bd5 commit cae2f08

File tree

9 files changed

+78
-40
lines changed

9 files changed

+78
-40
lines changed

CHANGES

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
Version History
22
===============
33

4+
Version 0.6.2 (unreleased)
5+
--------------------------
6+
* Make DRF dependency optional
7+
48
Version 0.6.1
59
-------------
610
* Fixed docs and test configuration

captcha/tests/drf_views.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from rest_framework import serializers, status
2+
from rest_framework.decorators import api_view
3+
from rest_framework.response import Response
4+
from django.contrib.auth.models import User
5+
6+
from captcha.serializers import CaptchaModelSerializer, CaptchaSerializer
7+
8+
9+
@api_view(["POST"])
10+
def test_serializer(request):
11+
serializer = CaptchaSerializer(data=request.POST)
12+
serializer.is_valid(raise_exception=True)
13+
return Response(status=status.HTTP_200_OK)
14+
15+
16+
@api_view(["POST"])
17+
def test_model_serializer(request):
18+
class UserCaptchaModelSerializer(CaptchaModelSerializer):
19+
subject = serializers.CharField(max_length=100)
20+
sender = serializers.EmailField()
21+
22+
class Meta:
23+
model = User
24+
fields = ("subject", "sender", "captcha_code", "captcha_hashkey")
25+
26+
serializer = UserCaptchaModelSerializer(data=request.POST)
27+
serializer.is_valid(raise_exception=True)
28+
return Response(status=status.HTTP_200_OK)

captcha/tests/tests.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
from django.urls import reverse
1616
from django.utils import timezone
1717
from django.utils.translation import gettext_lazy
18-
18+
from django.conf import settings as django_settings
1919
from captcha.conf import settings
2020
from captcha.models import CaptchaStore
21+
from unittest import skipIf
2122

2223

2324
@override_settings(ROOT_URLCONF="captcha.tests.urls")
@@ -572,6 +573,10 @@ def test_empty_pool_fallback(self):
572573
self.assertEqual(CaptchaStore.objects.count(), 1)
573574
settings.CAPTCHA_GET_FROM_POOL = __current_test_get_from_pool_setting
574575

576+
@skipIf(
577+
"rest_framework" not in django_settings.INSTALLED_APPS,
578+
"Only run if DRF is installed",
579+
)
575580
def test_serializer(self):
576581
r = self.client.post(
577582
reverse("captcha-test-serializer"),
@@ -582,6 +587,10 @@ def test_serializer(self):
582587
)
583588
self.assertEqual(r.status_code, 200)
584589

590+
@skipIf(
591+
"rest_framework" not in django_settings.INSTALLED_APPS,
592+
"Only run if DRF is installed",
593+
)
585594
def test_wrong_serializer(self):
586595
r = self.client.post(
587596
reverse("captcha-test-serializer"),
@@ -593,6 +602,10 @@ def test_wrong_serializer(self):
593602
self.assertEqual(r.status_code, 400)
594603
self.assertEqual(json.loads(r.content), {"error": "Invalid CAPTCHA"})
595604

605+
@skipIf(
606+
"rest_framework" not in django_settings.INSTALLED_APPS,
607+
"Only run if DRF is installed",
608+
)
596609
def test_model_serializer(self):
597610
r = self.client.post(
598611
reverse("captcha-test-model-serializer"),
@@ -605,6 +618,10 @@ def test_model_serializer(self):
605618
)
606619
self.assertEqual(r.status_code, 200)
607620

621+
@skipIf(
622+
"rest_framework" not in django_settings.INSTALLED_APPS,
623+
"Only run if DRF is installed",
624+
)
608625
def test_wrong_model_serializer(self):
609626
r = self.client.post(
610627
reverse("captcha-test-model-serializer"),

captcha/tests/urls.py

+15-8
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,19 @@
11
from django.urls import include, re_path
2+
from django.conf import settings
23

34
from .views import (
45
test,
56
test_custom_error_message,
67
test_custom_generator,
78
test_id_prefix,
89
test_model_form,
9-
test_model_serializer,
1010
test_non_required,
11-
test_serializer,
1211
)
1312

1413

1514
urlpatterns = [
1615
re_path(r"test/$", test, name="captcha-test"),
1716
re_path(r"test-modelform/$", test_model_form, name="captcha-test-model-form"),
18-
re_path(r"test-serializer/$", test_serializer, name="captcha-test-serializer"),
19-
re_path(
20-
r"test-model-serializer/$",
21-
test_model_serializer,
22-
name="captcha-test-model-serializer",
23-
),
2417
re_path(
2518
r"test2/$", test_custom_error_message, name="captcha-test-custom-error-message"
2619
),
@@ -31,3 +24,17 @@
3124
re_path(r"test-id-prefix/$", test_id_prefix, name="captcha-test-id-prefix"),
3225
re_path(r"", include("captcha.urls")),
3326
]
27+
28+
29+
if 'rest_framework' in settings.INSTALLED_APPS:
30+
from .drf_views import test_serializer, test_model_serializer
31+
32+
urlpatterns += [
33+
re_path(r"test-serializer/$", test_serializer, name="captcha-test-serializer"),
34+
re_path(
35+
r"test-model-serializer/$",
36+
test_model_serializer,
37+
name="captcha-test-model-serializer",
38+
),
39+
40+
]

captcha/tests/views.py

-25
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
from rest_framework import serializers, status
2-
from rest_framework.decorators import api_view
3-
from rest_framework.response import Response
41

52
from django import forms
63
from django.contrib.auth.models import User
74
from django.http import HttpResponse
85
from django.template import engines
96

107
from captcha.fields import CaptchaField
11-
from captcha.serializers import CaptchaModelSerializer, CaptchaSerializer
128

139

1410
TEST_TEMPLATE = r"""
@@ -117,24 +113,3 @@ class CaptchaTestForm(forms.Form):
117113

118114
return _test(request, CaptchaTestForm)
119115

120-
121-
@api_view(["POST"])
122-
def test_serializer(request):
123-
serializer = CaptchaSerializer(data=request.POST)
124-
serializer.is_valid(raise_exception=True)
125-
return Response(status=status.HTTP_200_OK)
126-
127-
128-
@api_view(["POST"])
129-
def test_model_serializer(request):
130-
class UserCaptchaModelSerializer(CaptchaModelSerializer):
131-
subject = serializers.CharField(max_length=100)
132-
sender = serializers.EmailField()
133-
134-
class Meta:
135-
model = User
136-
fields = ("subject", "sender", "captcha_code", "captcha_hashkey")
137-
138-
serializer = UserCaptchaModelSerializer(data=request.POST)
139-
serializer.is_valid(raise_exception=True)
140-
return Response(status=status.HTTP_200_OK)

setup.py

-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ def run_tests(self):
3535
"Django >= 4.2",
3636
"Pillow >=6.2.0",
3737
"django-ranged-response == 0.2.0",
38-
"djangorestframework >= 3.15.0",
3938
]
4039
EXTRAS_REQUIRE = {"test": ("testfixtures",)}
4140

testproject/drf_settings.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from testproject.settings import * # noqa
2+
INSTALLED_APPS.append("rest_framework") # noqa
3+

testproject/settings.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"django.contrib.sites",
3030
"django.forms",
3131
"django.contrib.messages",
32-
"rest_framework",
32+
# "rest_framework",
3333
"captcha",
3434
]
3535
FORM_RENDERER = "django.forms.renderers.TemplatesSetting"

tox.ini

+9-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ envlist =
77
py{39,310}-django42-jinja2,
88
py{310,311}-django{42,50}-jinja2,
99
py312-django{50,51}-jinja2,
10+
py313-django52-drf
1011
gettext,flake8,docs,coverage
1112

1213
[gh-actions]
1314
python =
14-
3.13: py312-django52,
15+
3.13: py312-django52, py312-django52-drf
1516
3.12: py312-django50, py312-django51, py312-django52, py312-django51-jinja2
1617
3.11: p311-django-51, p311-django-50, p311-django-50-jinjia, p311-django-42, p311-django-42-jinjia
1718
3.10: py310-django42, py310-django42-jinja2, py310-django50, py310-django51, py310-django50-jinja2
@@ -30,10 +31,10 @@ deps =
3031
django50: Django>=5.0a,<5.1
3132
django51: Django>=5.1,<5.2
3233
django52: Django>=5.2a1,<5.3
33-
py{39,310,311,312}-django{42,50}: python3-memcached
34+
py{39,310,311,312, 313}-django{42,50,51,52}: python3-memcached
35+
py313-django52-drf: djangorestframework
3436
jinja2
3537
Pillow
36-
djangorestframework
3738

3839
extras =
3940
test
@@ -54,6 +55,9 @@ commands = python -Wd manage.py test captcha --settings jinja2_settings
5455
[testenv:py312-django50-jinja2]
5556
commands = python -Wd manage.py test captcha --settings jinja2_settings
5657

58+
[testenv:py313-django52-drf]
59+
commands = python -Wd manage.py test captcha --settings drf_settings
60+
5761

5862
[testenv:gettext]
5963
basepython = python3.12
@@ -107,8 +111,9 @@ passenv =
107111
CAPTCHA_SOX_PATH
108112
deps =
109113
coverage
114+
djangorestframework
110115

111116
commands=
112117
# coverage debug config
113-
coverage run --rcfile=.coveragerc manage.py test captcha
118+
coverage run --rcfile=.coveragerc manage.py test captcha --settings drf_settings
114119
coverage report --rcfile=.coveragerc

0 commit comments

Comments
 (0)