Exemple #1
0
def create_django_route(dispatcher: Dispatcher) -> List[URLPattern]:
    view_variants = []
    viewset_variants = []
    for view_variant in dispatcher.view_variants:
        if isinstance(view_variant.handler, DRFViewMixinWrapper):
            vv = viewset_variants
        else:
            vv = view_variants
        vv.append(view_variant)

    rv = []
    # Prepare URLPatterns similar to http://www.django-rest-framework.org/api-guide/routers/#usage
    if view_variants:
        django_route_name = f'{dispatcher.route_namespace}.{dispatcher.route_name}'
        pattern = dispatcher.route_pattern.lstrip('/')  # removes django warnings
        pattern = complete_route_pattern(pattern, dispatcher.route_rules, _django_rule_format)
        regex_pattern = f'^{pattern}$'
        callback = PredicatedHandler(dispatcher.route_rules, view_variants)
        log.debug(f'Creating Django URL "{regex_pattern}" as the handler named "{dispatcher.route_name}" in the namespace "{dispatcher.route_namespace}".')
        rv.append(URLPattern(RegexPattern(regex_pattern, is_endpoint=True), callback, dispatcher.route_extra_kwargs, django_route_name))

    if viewset_variants:
        django_route_name = f'{dispatcher.route_namespace}.{dispatcher.route_name}-drf_viewset'
        pattern = dispatcher.route_pattern.lstrip('/')  # removes django warnings
        pattern = complete_route_pattern(pattern, dispatcher.route_rules, _django_rule_format)
        drf_pattern = '(?P<__frameapp_dynamic_viewset__>/(?P<pk>[^/.]+))?'
        regex_pattern = f'^{pattern}{drf_pattern}$'
        callback = PredicatedHandler(dispatcher.route_rules, viewset_variants)
        log.debug(f'Creating DRF URL "{regex_pattern}" as the handler named "{dispatcher.route_name}" in the namespace "{dispatcher.route_namespace}".')
        rv.append(URLPattern(RegexPattern(regex_pattern, is_endpoint=True), callback, dispatcher.route_extra_kwargs, django_route_name))
    return rv
def _get_django_urlpatterns(json_urlpatterns):
    """
    Parse JSON URLconf, and return a list of Django urlpatterns.

    :param json_urlpatterns: list of JSON URLconf dicts
    :return: list of Django URLResolver and URLPattern objects
    """
    django_urlpatterns = []
    for json_url in json_urlpatterns:
        includes = json_url.get("includes")
        if includes:
            # Make a URLResolver
            included_django_urlpatterns = _get_django_urlpatterns(includes)

            isLocalePrefix = json_url.get("isLocalePrefix")
            if isLocalePrefix:
                # Make a LocalePrefixPattern.
                # Custom sub-classes are allowed.
                LocalePrefixPatternClass = locate(json_url.get("classPath"))
                if not issubclass(LocalePrefixPatternClass,
                                  LocalePrefixPattern):
                    raise ValueError(
                        f"Locale prefix class {json_url.get('classPath')} "
                        f"is not a subclass of LocalePrefixPattern")
                django_url = URLResolver(LocalePrefixPatternClass(),
                                         included_django_urlpatterns)

            else:
                # Make an include(...)
                PatternClass, regex = _get_pattern_class_and_regex(json_url)
                pattern = PatternClass(regex, is_endpoint=False)
                django_url = URLResolver(
                    pattern,
                    included_django_urlpatterns,
                    app_name=json_url.get("app_name"),
                    namespace=json_url.get("namespace"),
                )

        else:
            # Make a URLPattern
            name = json_url.get("name")
            PatternClass, regex = _get_pattern_class_and_regex(json_url)
            pattern = PatternClass(regex, name=name, is_endpoint=True)
            # Make a dummy view so the URL Pattern is valid.
            # If this view is ever actually rendered, it will return 404.
            # Note we're also ignoring the kwargs that can be added to url() definitions.
            # These are not used to generate urls, they are just passed to the view.
            django_url = URLPattern(pattern, Http404View.as_view(), name=name)

        django_urlpatterns.append(django_url)
    return django_urlpatterns
Exemple #3
0
    def test_create_skipped_test_for_not_supported_endpoint(
            self, http_method, mocked_normalize):
        mocked_normalize.return_value = []
        tests_generator = SmokeTestsGenerator()
        url_pattern = URLPattern(r'^{}$'.format(create_random_string()),
                                 RedirectView.as_view(url='/',
                                                      permanent=False),
                                 name=create_random_string())
        expected_test_name = tests_generator.create_test_name(
            http_method, get_pattern(url_pattern))

        tests_generator.create_tests_for_endpoint(get_pattern(url_pattern),
                                                  url_pattern.name)
        self.assertTrue(hasattr(SmokeTests, expected_test_name))

        is_successful, failures, skipped = self._execute_smoke_test(
            expected_test_name)

        self.assertEqual(len(skipped), 1)
        self.assertEqual(len(tests_generator.warnings), 1)
 def decorate_pattern(self, pattern):
     if isinstance(pattern, URLResolver):
         decorated = URLResolver(
             pattern.pattern,
             DecoratedPatterns(pattern.urlconf_module, self.decorators),
             pattern.default_kwargs,
             pattern.app_name,
             pattern.namespace,
         )
     else:
         callback = pattern.callback
         for decorator in reversed(self.decorators):
             callback = decorator(callback)
         decorated = URLPattern(
             pattern.pattern,
             callback,
             pattern.default_args,
             pattern.name,
         )
     return decorated
Exemple #5
0
    def test_smoke_test_is_created_only_for_specified_app(
            self, mocked_call_command):
        outside_app_url_pattern = URLPattern(
            r'^{}$'.format(create_random_string()),
            RedirectView.as_view(url='/', permanent=False),
            name=create_random_string())
        outside_app_test_name = self.tests_generator.create_test_name(
            'GET', get_pattern(outside_app_url_pattern))

        inside_app_url_pattern = app_url_patterns[0]
        inside_app_url_full_pattern = '^app_urls/' + get_pattern(
            inside_app_url_pattern)
        inside_app_test_name = self.tests_generator.create_test_name(
            'GET', inside_app_url_full_pattern)

        tests_generator = SmokeTestsGenerator(app_names=['tests.app'])
        tests_generator.execute()

        self.assertFalse(hasattr(SmokeTests, outside_app_test_name))

        self.assertTrue(hasattr(SmokeTests, inside_app_test_name))

        mocked_call_command.assert_called_once_with('test',
                                                    'django_smoke_tests')
Exemple #6
0
def event_url(route, view, name=None, require_live=True):
    if callable(view):
        pattern = RegexPattern(route, name=name, is_endpoint=True)
        pattern._require_live = require_live
        return URLPattern(pattern, view, {}, name)
    raise TypeError('view must be a callable.')
Exemple #7
0
 def resolve(self, *args, **kwargs):
     result = URLPattern.resolve(self, *args, **kwargs)
     if result:
         for func in self._decorate_with:
             result.func = func(result.func)
     return result
Exemple #8
0
# Copyright 2019 Pants project contributors (see CONTRIBUTORS.md).
# Licensed under the Apache License, Version 2.0 (see LICENSE).

from django.urls import URLPattern

DEBUG: bool = True
DEFAULT_FROM_EMAIL: str = '*****@*****.**'
SECRET_KEY: str = 'not so secret'

MY_SETTING: URLPattern = URLPattern(pattern='foo', callback=lambda: None)
Exemple #9
0
# Copyright 2019 Pants project contributors (see CONTRIBUTORS.md).
# Licensed under the Apache License, Version 2.0 (see LICENSE).

from django.urls import URLPattern

DEBUG: bool = True
DEFAULT_FROM_EMAIL: str = "*****@*****.**"
SECRET_KEY: str = "not so secret"

MY_SETTING: URLPattern = URLPattern(pattern="foo", callback=lambda: None)