mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-23 10:03:57 +03:00
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
|
"""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 ''
|