Move view name/description functions into public space

This commit is contained in:
Tom Christie 2013-08-19 08:24:27 +01:00
parent a8aabe23c9
commit 89b0a539c3
3 changed files with 33 additions and 28 deletions

View File

@ -70,8 +70,8 @@ DEFAULTS = {
'PAGINATE_BY_PARAM': None, 'PAGINATE_BY_PARAM': None,
# View configuration # View configuration
'VIEW_NAME_FUNCTION': 'rest_framework.utils.formatting.view_name', 'VIEW_NAME_FUNCTION': 'rest_framework.views.get_view_name',
'VIEW_DESCRIPTION_FUNCTION': 'rest_framework.utils.formatting.view_description', 'VIEW_DESCRIPTION_FUNCTION': 'rest_framework.views.get_view_description',
# Authentication # Authentication
'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser', 'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser',

View File

@ -5,12 +5,13 @@ from __future__ import unicode_literals
from django.utils.html import escape from django.utils.html import escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from rest_framework.compat import apply_markdown, smart_text from rest_framework.compat import apply_markdown
import re
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
from textwrap import dedent
import re
def _remove_trailing_string(content, trailing): def remove_trailing_string(content, trailing):
""" """
Strip trailing component `trailing` from `content` if it exists. Strip trailing component `trailing` from `content` if it exists.
Used when generating names from view classes. Used when generating names from view classes.
@ -20,10 +21,14 @@ def _remove_trailing_string(content, trailing):
return content return content
def _remove_leading_indent(content): def dedent(content):
""" """
Remove leading indent from a block of text. Remove leading indent from a block of text.
Used when generating descriptions from docstrings. Used when generating descriptions from docstrings.
Note that python's `textwrap.dedent` doesn't quite cut it,
as it fails to dedent multiline docstrings that include
unindented text on the initial line.
""" """
whitespace_counts = [len(line) - len(line.lstrip(' ')) whitespace_counts = [len(line) - len(line.lstrip(' '))
for line in content.splitlines()[1:] if line.lstrip()] for line in content.splitlines()[1:] if line.lstrip()]
@ -32,11 +37,10 @@ def _remove_leading_indent(content):
if whitespace_counts: if whitespace_counts:
whitespace_pattern = '^' + (' ' * min(whitespace_counts)) whitespace_pattern = '^' + (' ' * min(whitespace_counts))
content = re.sub(re.compile(whitespace_pattern, re.MULTILINE), '', content) content = re.sub(re.compile(whitespace_pattern, re.MULTILINE), '', content)
content = content.strip('\n')
return content
return content.strip()
def _camelcase_to_spaces(content): def camelcase_to_spaces(content):
""" """
Translate 'CamelCaseNames' to 'Camel Case Names'. Translate 'CamelCaseNames' to 'Camel Case Names'.
Used when generating names from view classes. Used when generating names from view classes.
@ -54,21 +58,3 @@ def markup_description(description):
else: else:
description = escape(description).replace('\n', '<br />') description = escape(description).replace('\n', '<br />')
return mark_safe(description) return mark_safe(description)
def view_name(instance, view, suffix=None):
name = view.__name__
name = _remove_trailing_string(name, 'View')
name = _remove_trailing_string(name, 'ViewSet')
name = _camelcase_to_spaces(name)
if suffix:
name += ' ' + suffix
return name
def view_description(instance, view, html=False):
description = view.__doc__ or ''
description = _remove_leading_indent(smart_text(description))
if html:
return markup_description(description)
return description

View File

@ -8,10 +8,29 @@ from django.http import Http404
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from rest_framework import status, exceptions from rest_framework import status, exceptions
from rest_framework.compat import View, HttpResponseBase from rest_framework.compat import smart_text, HttpResponseBase, View
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
from rest_framework.utils import formatting
def get_view_name(instance, view, suffix=None):
name = view.__name__
name = formatting.remove_trailing_string(name, 'View')
name = formatting.remove_trailing_string(name, 'ViewSet')
name = formatting.camelcase_to_spaces(name)
if suffix:
name += ' ' + suffix
return name
def get_view_description(instance, view, html=False):
description = view.__doc__ or ''
description = formatting.dedent(smart_text(description))
if html:
return formatting.markup_description(description)
return description
class APIView(View): class APIView(View):