diff --git a/rest_framework/schemas/coreapi.py b/rest_framework/schemas/coreapi.py index 5cf789f9f..a2252ff79 100644 --- a/rest_framework/schemas/coreapi.py +++ b/rest_framework/schemas/coreapi.py @@ -20,7 +20,18 @@ from .utils import get_pk_description, is_list_view header_regex = re.compile('^[a-zA-Z][0-9A-Za-z_]*:') # Generator # -# TODO: Pull some of this into base. + + +def common_path(paths): + split_paths = [path.strip('/').split('/') for path in paths] + s1 = min(split_paths) + s2 = max(split_paths) + common = s1 + for i, c in enumerate(s1): + if c != s2[i]: + common = s1[:i] + break + return '/' + '/'.join(common) def is_custom_action(action): @@ -209,6 +220,37 @@ class SchemaGenerator(BaseSchemaGenerator): # Default action, eg "/users/", "/users/{pk}/" return named_path_components + [action] + def determine_path_prefix(self, paths): + """ + Given a list of all paths, return the common prefix which should be + discounted when generating a schema structure. + + This will be the longest common string that does not include that last + component of the URL, or the last component before a path parameter. + + For example: + + /api/v1/users/ + /api/v1/users/{pk}/ + + The path prefix is '/api/v1' + """ + prefixes = [] + for path in paths: + components = path.strip('/').split('/') + initial_components = [] + for component in components: + if '{' in component: + break + initial_components.append(component) + prefix = '/'.join(initial_components[:-1]) + if not prefix: + # We can just break early in the case that there's at least + # one URL that doesn't have a path prefix. + return '/' + prefixes.append('/' + prefix + '/') + return common_path(prefixes) + # View Inspectors # diff --git a/rest_framework/schemas/generators.py b/rest_framework/schemas/generators.py index c80ace7d3..a656c3ba5 100644 --- a/rest_framework/schemas/generators.py +++ b/rest_framework/schemas/generators.py @@ -18,18 +18,6 @@ from rest_framework.settings import api_settings from rest_framework.utils.model_meta import _get_pk -def common_path(paths): - split_paths = [path.strip('/').split('/') for path in paths] - s1 = min(split_paths) - s2 = max(split_paths) - common = s1 - for i, c in enumerate(s1): - if c != s2[i]: - common = s1[:i] - break - return '/' + '/'.join(common) - - def get_pk_name(model): meta = model._meta.concrete_model._meta return _get_pk(meta).name @@ -236,37 +224,6 @@ class BaseSchemaGenerator(object): def get_schema(self, request=None, public=False): raise NotImplementedError(".get_schema() must be implemented in subclasses.") - def determine_path_prefix(self, paths): - """ - Given a list of all paths, return the common prefix which should be - discounted when generating a schema structure. - - This will be the longest common string that does not include that last - component of the URL, or the last component before a path parameter. - - For example: - - /api/v1/users/ - /api/v1/users/{pk}/ - - The path prefix is '/api/v1' - """ - prefixes = [] - for path in paths: - components = path.strip('/').split('/') - initial_components = [] - for component in components: - if '{' in component: - break - initial_components.append(component) - prefix = '/'.join(initial_components[:-1]) - if not prefix: - # We can just break early in the case that there's at least - # one URL that doesn't have a path prefix. - return '/' - prefixes.append('/' + prefix + '/') - return common_path(prefixes) - def has_view_permissions(self, path, method, view): """ Return `True` if the incoming request has the correct view permissions.