Exemple #1
0
    def get_api_endpoints(self, patterns=None, prefix=''):
        """
        Return a list of all available API endpoints by inspecting the URL conf.
        """
        if patterns is None:
            patterns = self.patterns

        api_endpoints = []

        for pattern in patterns:
            path_regex = prefix + get_original_route(pattern)
            if isinstance(pattern, URLPattern):
                path = self.get_path_from_regex(path_regex)
                callback = pattern.callback
                if self.should_include_endpoint(path, callback):
                    for method in self.get_allowed_methods(callback):
                        endpoint = (path, method, callback)
                        api_endpoints.append(endpoint)

            elif isinstance(pattern, URLResolver):
                nested_endpoints = self.get_api_endpoints(
                    patterns=pattern.url_patterns,
                    prefix=path_regex
                )
                api_endpoints.extend(nested_endpoints)

        api_endpoints = sorted(api_endpoints, key=endpoint_ordering)

        return api_endpoints
Exemple #2
0
    def get_api_endpoints(self, patterns=None, prefix=''):
        """
        Return a list of all available API endpoints by inspecting the URL conf.
        """
        if patterns is None:
            patterns = self.patterns

        api_endpoints = []

        for pattern in patterns:
            path_regex = prefix + get_original_route(pattern)
            if isinstance(pattern, URLPattern):
                path = self.get_path_from_regex(path_regex)
                callback = pattern.callback
                if self.should_include_endpoint(path, callback):
                    for method in self.get_allowed_methods(callback):
                        endpoint = (path, path_regex, method, callback)
                        api_endpoints.append(endpoint)

            elif isinstance(pattern, URLResolver):
                nested_endpoints = self.get_api_endpoints(
                    patterns=pattern.url_patterns, prefix=path_regex)
                api_endpoints.extend(nested_endpoints)

        return sorted(api_endpoints, key=alpha_operation_sorter)
Exemple #3
0
    def get_api_endpoints(self,
                          patterns=None,
                          prefix='',
                          app_name=None,
                          namespace=None,
                          ignored_endpoints=None):
        """
        Return a list of all available API endpoints by inspecting the URL conf.

        Copied entirely from super.
        """
        if patterns is None:
            patterns = self.patterns

        api_endpoints = []
        if ignored_endpoints is None:
            ignored_endpoints = set()

        for pattern in patterns:
            path_regex = prefix + get_original_route(pattern)
            if isinstance(pattern, URLPattern):
                try:
                    path = self.get_path_from_regex(path_regex)
                    callback = pattern.callback
                    url_name = pattern.name
                    if self.should_include_endpoint(path, callback, app_name
                                                    or '', namespace or '',
                                                    url_name):
                        path = self.replace_version(path, callback)

                        # avoid adding endpoints that have already been seen,
                        # as Django resolves urls in top-down order
                        if path in ignored_endpoints:
                            continue
                        ignored_endpoints.add(path)

                        for method in self.get_allowed_methods(callback):
                            endpoint = (path, method, callback)
                            api_endpoints.append(endpoint)
                except Exception:  # pragma: no cover
                    logger.warning('failed to enumerate view', exc_info=True)

            elif isinstance(pattern, URLResolver):
                nested_endpoints = self.get_api_endpoints(
                    patterns=pattern.url_patterns,
                    prefix=path_regex,
                    app_name="%s:%s" % (app_name, pattern.app_name)
                    if app_name else pattern.app_name,
                    namespace="%s:%s" % (namespace, pattern.namespace)
                    if namespace else pattern.namespace,
                    ignored_endpoints=ignored_endpoints)
                api_endpoints.extend(nested_endpoints)
            else:
                logger.warning("unknown pattern type {}".format(type(pattern)))

        api_endpoints = sorted(api_endpoints, key=endpoint_ordering)

        return api_endpoints
Exemple #4
0
    def get_api_endpoints(self, patterns=None, prefix='', namespace=""):  # noqa max-complexity=12
        """
        Return a list of all available API endpoints with basename by inspecting the URL conf.
        """
        if patterns is None:
            patterns = self.patterns

        find_endpoint = re.compile(r'([^\/\^\?\]\+\)\(\.]+)(?:(?=\/\([^\)]+\)\/\$)|(?=\/\$))')

        api_endpoints = []

        pattern_basenames = {}

        for pattern in patterns:

            path_regex = get_original_route(pattern)
            if isinstance(pattern, URLPattern):
                path = self.get_path_from_regex(path_regex)
                callback = pattern.callback
                if pattern.name:
                    if len(pattern.name.split('-')) > 1:
                        basename = pattern.name.split('-')[0]
                    else:
                        basename = pattern.name.split('_')[0]
                    basename = namespace + basename
                else:
                    basename = None
                sub = None
                if find_endpoint.search(pattern.describe()) and basename not in pattern_basenames:
                    sub = find_endpoint.search(pattern.describe()).groups()[0]
                    pattern_basenames[basename] = sub
                else:
                    sub = pattern_basenames.get(basename, None)
                if self.should_include_endpoint(path, callback):
                    for method in self.get_allowed_methods(callback):
                        if sub:
                            subtest = re.compile('^' + sub)
                            if basename and sub:
                                if not subtest.match(path) and sub in path:
                                    path = ('^' + path[path.index(sub):])
                                path = path.replace(sub, basename)
                        endpoint = (path, method, callback)
                        api_endpoints.append(endpoint)

            elif isinstance(pattern, URLResolver):
                inner_namespace = namespace + pattern.namespace + ":" if pattern.namespace else namespace
                nested_endpoints = self.get_api_endpoints(
                    patterns=pattern.url_patterns,
                    prefix=path_regex,
                    namespace=inner_namespace,
                )
                api_endpoints.extend(nested_endpoints)

        api_endpoints = sorted(api_endpoints, key=endpoint_ordering)

        return api_endpoints
Exemple #5
0
    def get_api_endpoints(self,
                          patterns=None,
                          prefix='',
                          app_name=None,
                          namespace=None,
                          default_decorators=None):
        """
        Return a list of all available API endpoints by inspecting the URL conf.
        Copied from super and edited to look at decorators.
        """
        #pylint:disable=arguments-differ,too-many-arguments,too-many-locals
        if patterns is None:
            patterns = self.patterns

        api_endpoints = []

        for pattern in patterns:
            path_regex = prefix + get_original_route(pattern)
            decorators = default_decorators
            if hasattr(pattern, 'decorators'):
                decorators = pattern.decorators
            if isinstance(pattern, URLPattern):
                try:
                    path = self.get_path_from_regex(path_regex)
                    callback = pattern.callback
                    url_name = pattern.name
                    if self.should_include_endpoint(path, callback, app_name
                                                    or '', namespace or '',
                                                    url_name):
                        path = self.replace_version(path, callback)
                        for method in self.get_allowed_methods(callback):
                            endpoint = (path, method, callback, decorators)
                            api_endpoints.append(endpoint)
                except Exception:  #pylint:disable=broad-except
                    LOGGER.warning('failed to enumerate view', exc_info=True)

            elif isinstance(pattern, URLResolver):
                nested_endpoints = self.get_api_endpoints(
                    patterns=pattern.url_patterns,
                    prefix=path_regex,
                    app_name="%s:%s" % (app_name, pattern.app_name)
                    if app_name else pattern.app_name,
                    namespace="%s:%s" % (namespace, pattern.namespace)
                    if namespace else pattern.namespace,
                    default_decorators=decorators)
                api_endpoints.extend(nested_endpoints)
            else:
                LOGGER.warning("unknown pattern type %s", type(pattern))

        api_endpoints = sorted(api_endpoints, key=endpoint_ordering)
        return api_endpoints
Exemple #6
0
    def get_api_endpoints(self,
                          patterns=None,
                          prefix='',
                          app_name=None,
                          namespace=None):
        """
        Return a list of all available API endpoints by inspecting the URL conf.

        Copied entirely from super.
        """
        if patterns is None:
            patterns = self.patterns

        api_endpoints = []

        for pattern in patterns:
            path_regex = prefix + get_original_route(pattern)
            if isinstance(pattern, URLPattern):
                path = self.get_path_from_regex(path_regex)
                callback = pattern.callback
                url_name = pattern.name
                if self.should_include_endpoint(path, callback, app_name or '',
                                                namespace or '', url_name):
                    path = self.replace_version(path, callback)
                    for method in self.get_allowed_methods(callback):
                        endpoint = (path, method, callback)
                        api_endpoints.append(endpoint)

            elif isinstance(pattern, URLResolver):
                nested_endpoints = self.get_api_endpoints(
                    patterns=pattern.url_patterns,
                    prefix=path_regex,
                    app_name="%s:%s" % (app_name, pattern.app_name)
                    if app_name else pattern.app_name,
                    namespace="%s:%s" % (namespace, pattern.namespace)
                    if namespace else pattern.namespace)
                api_endpoints.extend(nested_endpoints)
            else:
                logger.warning("unknown pattern type {}".format(type(pattern)))

        api_endpoints = sorted(api_endpoints, key=endpoint_ordering)

        return api_endpoints
Exemple #7
0
    def get_api_endpoints(self, patterns=None, prefix=''):
        """
        Return a list of all available API endpoints by inspecting the URL conf.
        """
        if patterns is None:
            patterns = self.patterns

        api_endpoints = []

        for pattern in patterns:
            path_regex = prefix + get_original_route(pattern)
            if isinstance(pattern, URLResolver):
                nested_endpoints = self.get_api_endpoints(
                    patterns=pattern.url_patterns, prefix=path_regex)
                api_endpoints.extend(nested_endpoints)

        api_endpoints = sorted(api_endpoints, key=endpoint_ordering)

        return api_endpoints
Exemple #8
0
def get_api_endpoints(patterns=None, namespace="", prefix=""):
    """
    Return a list of all available API endpoints by inspecting the URL conf.
    """
    api_endpoints = []

    for pattern in patterns:
        path_regex = prefix + get_original_route(pattern)

        if isinstance(pattern, URLPattern):
            path = get_path_from_regex(path_regex)
            callback = pattern.callback
            if should_include_endpoint(path, callback):
                for method in get_allowed_methods(callback):
                    endpoint = {
                        "path": path,
                        "method": method,
                        "pattern": pattern,
                        "namespace": namespace,
                    }
                    api_endpoints.append(endpoint)

        elif isinstance(pattern, URLResolver):
            if namespace and pattern.namespace:
                pattern_namespace = f"{namespace}:{pattern.namespace}"
            elif namespace:
                pattern_namespace = namespace
            else:
                pattern_namespace = pattern.namespace

            nested_endpoints = get_api_endpoints(patterns=pattern.url_patterns,
                                                 prefix=path_regex,
                                                 namespace=pattern_namespace)
            api_endpoints.extend(nested_endpoints)

    return api_endpoints
Exemple #9
0
def get_api_endpoints(patterns=None, namespace="", prefix=""):
    """
    Return a list of all available API endpoints by inspecting the URL conf.
    """
    api_endpoints = []

    for pattern in patterns:
        path_regex = prefix + get_original_route(pattern)

        if isinstance(pattern, URLPattern):
            path = get_path_from_regex(path_regex)
            callback = pattern.callback
            if should_include_endpoint(path, callback):
                for method in get_allowed_methods(callback):
                    endpoint = {
                        "path": path,
                        "method": method,
                        "pattern": pattern,
                        "namespace": namespace,
                    }
                    api_endpoints.append(endpoint)

        elif isinstance(pattern, URLResolver):
            if namespace and pattern.namespace:
                pattern_namespace = f"{namespace}:{pattern.namespace}"
            elif namespace:
                pattern_namespace = namespace
            else:
                pattern_namespace = pattern.namespace

            nested_endpoints = get_api_endpoints(
                patterns=pattern.url_patterns, prefix=path_regex, namespace=pattern_namespace
            )
            api_endpoints.extend(nested_endpoints)

    return api_endpoints