aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/description.py
blob: f7145c0f89b6017e2b1570ef1662f260eec636d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
"""Get a descriptive name and description for a view,
based on class name and docstring, and override-able by 'name' and 'description' attributes"""
import re

def get_name(view):
    """Return a name for the view.
    
    If view has a name attribute, use that, otherwise use the view's class name, with 'CamelCaseNames' converted to 'Camel Case Names'."""
    if getattr(view, 'name', None) is not None:
        return view.name

    if getattr(view, '__name__', None) is not None:
        name = view.__name__
    elif getattr(view, '__class__', None) is not None:  # TODO: should be able to get rid of this case once refactoring to 1.3 class views is complete
        name = view.__class__.__name__
    else:
        return ''

    return re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1', name).strip()

def get_description(view):
    """Provide a description for the view.

    By default this is the view's docstring with nice unindention applied."""
    if getattr(view, 'description', None) is not None:
        return getattr(view, 'description')

    if getattr(view, '__doc__', None) is not None:
        whitespace_counts = [len(line) - len(line.lstrip(' ')) for line in view.__doc__.splitlines()[1:] if line.lstrip()]

        if whitespace_counts:
            whitespace_pattern = '^' + (' ' * min(whitespace_counts))
            return re.sub(re.compile(whitespace_pattern, re.MULTILINE), '', view.__doc__)

        return view.__doc__
    
    return ''