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
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
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')
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.')
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
# 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)
# 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)