Skip to content

Commit d92b24a

Browse files
Ryan P Kilbytomchristie
Ryan P Kilby
authored andcommitted
Make serializer fields import explicit (encode#4628)
1 parent 5c54b22 commit d92b24a

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

Diff for: rest_framework/serializers.py

+26-3
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,27 @@
1212
"""
1313
from __future__ import unicode_literals
1414

15+
import copy
16+
import inspect
1517
import traceback
18+
from collections import OrderedDict
1619

20+
from django.core.exceptions import ValidationError as DjangoValidationError
21+
from django.core.exceptions import ImproperlyConfigured
1722
from django.db import models
1823
from django.db.models import DurationField as ModelDurationField
1924
from django.db.models.fields import Field as DjangoModelField
2025
from django.db.models.fields import FieldDoesNotExist
26+
from django.utils import six, timezone
2127
from django.utils.functional import cached_property
2228
from django.utils.translation import ugettext_lazy as _
2329

2430
from rest_framework.compat import JSONField as ModelJSONField
2531
from rest_framework.compat import postgres_fields, set_many, unicode_to_repr
26-
from rest_framework.utils import model_meta
32+
from rest_framework.exceptions import ErrorDetail, ValidationError
33+
from rest_framework.fields import get_error_detail, set_value
34+
from rest_framework.settings import api_settings
35+
from rest_framework.utils import html, model_meta, representation
2736
from rest_framework.utils.field_mapping import (
2837
ClassLookupDict, get_field_kwargs, get_nested_relation_kwargs,
2938
get_relation_kwargs, get_url_kwargs
@@ -42,9 +51,23 @@
4251
#
4352
# This helps keep the separation between model fields, form fields, and
4453
# serializer fields more explicit.
54+
from rest_framework.fields import ( # NOQA # isort:skip
55+
BooleanField, CharField, ChoiceField, DateField, DateTimeField, DecimalField,
56+
DictField, DurationField, EmailField, Field, FileField, FilePathField, FloatField,
57+
HiddenField, IPAddressField, ImageField, IntegerField, JSONField, ListField,
58+
ModelField, MultipleChoiceField, NullBooleanField, ReadOnlyField, RegexField,
59+
SerializerMethodField, SlugField, TimeField, URLField, UUIDField,
60+
)
61+
from rest_framework.relations import ( # NOQA # isort:skip
62+
HyperlinkedIdentityField, HyperlinkedRelatedField, ManyRelatedField,
63+
PrimaryKeyRelatedField, RelatedField, SlugRelatedField, StringRelatedField,
64+
)
4565

46-
from rest_framework.fields import * # NOQA # isort:skip
47-
from rest_framework.relations import * # NOQA # isort:skip
66+
# Non-field imports, but public API
67+
from rest_framework.fields import ( # NOQA # isort:skip
68+
CreateOnlyDefault, CurrentUserDefault, SkipField, empty
69+
)
70+
from rest_framework.relations import Hyperlink, PKOnlyObject # NOQA # isort:skip
4871

4972
# We assume that 'validators' are intended for the child serializer,
5073
# rather than the parent serializer.

Diff for: tests/test_serializer.py

+44-1
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,60 @@
11
# coding: utf-8
22
from __future__ import unicode_literals
33

4+
import inspect
45
import pickle
56
import re
67

78
import pytest
89

9-
from rest_framework import serializers
10+
from rest_framework import fields, relations, serializers
1011
from rest_framework.compat import unicode_repr
12+
from rest_framework.fields import Field
1113

1214
from .utils import MockObject
1315

1416

17+
# Test serializer fields imports.
18+
# -------------------------------
19+
20+
class TestFieldImports:
21+
def is_field(self, name, value):
22+
return (
23+
isinstance(value, type) and
24+
issubclass(value, Field) and
25+
not name.startswith('_')
26+
)
27+
28+
def test_fields(self):
29+
msg = "Expected `fields.%s` to be imported in `serializers`"
30+
field_classes = [
31+
key for key, value
32+
in inspect.getmembers(fields)
33+
if self.is_field(key, value)
34+
]
35+
36+
# sanity check
37+
assert 'Field' in field_classes
38+
assert 'BooleanField' in field_classes
39+
40+
for field in field_classes:
41+
assert hasattr(serializers, field), msg % field
42+
43+
def test_relations(self):
44+
msg = "Expected `relations.%s` to be imported in `serializers`"
45+
field_classes = [
46+
key for key, value
47+
in inspect.getmembers(relations)
48+
if self.is_field(key, value)
49+
]
50+
51+
# sanity check
52+
assert 'RelatedField' in field_classes
53+
54+
for field in field_classes:
55+
assert hasattr(serializers, field), msg % field
56+
57+
1558
# Tests for core functionality.
1659
# -----------------------------
1760

0 commit comments

Comments
 (0)