From ec0f4c46ffd2116004938a71f32bd1d5d6b4bd50 Mon Sep 17 00:00:00 2001 From: Craig de Stigter Date: Thu, 21 Jan 2016 10:26:24 +1300 Subject: [PATCH] Turn style assertions into warnings, so they can be opted out of. --- rest_framework/fields.py | 14 ++++++++------ rest_framework/relations.py | 10 ++++++---- tests/test_fields.py | 5 +++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index a2b0f3bf1..279bd22db 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -8,6 +8,7 @@ import inspect import json import re import uuid +import warnings from collections import OrderedDict from django.conf import settings @@ -325,12 +326,13 @@ class Field(object): # In order to enforce a consistent style, we error if a redundant # 'source' argument has been used. For example: # my_field = serializer.CharField(source='my_field') - assert self.source != field_name, ( - "It is redundant to specify `source='%s'` on field '%s' in " - "serializer '%s', because it is the same as the field name. " - "Remove the `source` keyword argument." % - (field_name, self.__class__.__name__, parent.__class__.__name__) - ) + if field_name == self.source: + warnings.warn( + "It is redundant to specify `source='%s'` on field '%s' in " + "serializer '%s', because it is the same as the field name. " + "Remove the `source` keyword argument." % + (field_name, self.__class__.__name__, parent.__class__.__name__), + ) self.field_name = field_name self.parent = parent diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 7e04e7e47..18eeda284 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -1,6 +1,7 @@ # coding: utf-8 from __future__ import unicode_literals +import warnings from collections import OrderedDict from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist @@ -80,10 +81,11 @@ class RelatedField(Field): 'Relational field must provide a `queryset` argument, ' 'override `get_queryset`, or set read_only=`True`.' ) - assert not (self.queryset is not None and kwargs.get('read_only', None)), ( - 'Relational fields should not provide a `queryset` argument, ' - 'when setting read_only=`True`.' - ) + if self.queryset is not None and kwargs.get('read_only'): + warnings.warn( + 'Relational fields should not provide a `queryset` argument, ' + 'when setting read_only=`True`.' + ) kwargs.pop('many', None) kwargs.pop('allow_empty', None) super(RelatedField, self).__init__(**kwargs) diff --git a/tests/test_fields.py b/tests/test_fields.py index 43441c2e7..2705fc4a4 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -90,9 +90,10 @@ class TestSource: def test_redundant_source(self): class ExampleSerializer(serializers.Serializer): example_field = serializers.CharField(source='example_field') - with pytest.raises(AssertionError) as exc_info: + with pytest.warns(UserWarning) as record: ExampleSerializer().fields - assert str(exc_info.value) == ( + assert len(record) == 1 + assert record[0].message.args[0] == ( "It is redundant to specify `source='example_field'` on field " "'CharField' in serializer 'ExampleSerializer', because it is the " "same as the field name. Remove the `source` keyword argument."