diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 784cf69d..3ff02078 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,4 +11,4 @@ repos: rev: 7.0.0 hooks: - id: flake8 - + additional_dependencies: [flake8-pyproject] diff --git a/benchmarks/component_rendering.py b/benchmarks/component_rendering.py index cdd5c009..98b48828 100644 --- a/benchmarks/component_rendering.py +++ b/benchmarks/component_rendering.py @@ -4,10 +4,7 @@ from django.template import Context, Template from django.test import override_settings from django_components import component -from django_components.middleware import ( - CSS_DEPENDENCY_PLACEHOLDER, - JS_DEPENDENCY_PLACEHOLDER, -) +from django_components.middleware import CSS_DEPENDENCY_PLACEHOLDER, JS_DEPENDENCY_PLACEHOLDER from tests.django_test_setup import * # NOQA from tests.testutils import Django30CompatibleSimpleTestCase as SimpleTestCase from tests.testutils import create_and_process_template_response @@ -75,9 +72,7 @@ class RenderBenchmarks(SimpleTestCase): component.registry.clear() component.registry.register("test_component", SlottedComponent) component.registry.register("inner_component", SimpleComponent) - component.registry.register( - "breadcrumb_component", BreadcrumbComponent - ) + component.registry.register("breadcrumb_component", BreadcrumbComponent) @staticmethod def timed_loop(func, iterations=1000): @@ -91,22 +86,28 @@ class RenderBenchmarks(SimpleTestCase): def test_render_time_for_small_component(self): template = Template( - "{% load component_tags %}{% component_block 'test_component' %}" - "{% slot \"header\" %}{% component_block 'inner_component' variable='foo' %}{% endslot %}{% endcomponent_block %}" - "{% endcomponent_block %}", - name="root", + """ + {% load component_tags %} + {% component_block 'test_component' %} + {% slot "header" %} + {% component_block 'inner_component' variable='foo' %}{% endcomponent_block %} + {% endslot %} + {% endcomponent_block %} + """ ) - print( - f"{self.timed_loop(lambda: template.render(Context({})))} ms per iteration" - ) + print(f"{self.timed_loop(lambda: template.render(Context({})))} ms per iteration") def test_middleware_time_with_dependency_for_small_page(self): template = Template( - "{% load component_tags %}{% component_dependencies %}" - "{% component_block 'test_component' %}{% slot \"header\" %}" - "{% component_block 'inner_component' variable='foo' %}{% endslot %}{% endcomponent_block %}{% endcomponent_block %}", - name="root", + """ + {% load component_tags %}{% component_dependencies %} + {% component_block 'test_component' %} + {% slot "header" %} + {% component_block 'inner_component' variable='foo' %}{% endcomponent_block %} + {% endslot %} + {% endcomponent_block %} + """ ) # Sanity tests response_content = create_and_process_template_response(template) @@ -116,15 +117,9 @@ class RenderBenchmarks(SimpleTestCase): self.assertIn("script.js", response_content) without_middleware = self.timed_loop( - lambda: create_and_process_template_response( - template, use_middleware=False - ) - ) - with_middleware = self.timed_loop( - lambda: create_and_process_template_response( - template, use_middleware=True - ) + lambda: create_and_process_template_response(template, use_middleware=False) ) + with_middleware = self.timed_loop(lambda: create_and_process_template_response(template, use_middleware=True)) print("Small page middleware test") self.report_results(with_middleware, without_middleware) @@ -140,14 +135,10 @@ class RenderBenchmarks(SimpleTestCase): self.assertIn("test.js", response_content) without_middleware = self.timed_loop( - lambda: create_and_process_template_response( - template, {}, use_middleware=False - ) + lambda: create_and_process_template_response(template, {}, use_middleware=False) ) with_middleware = self.timed_loop( - lambda: create_and_process_template_response( - template, {}, use_middleware=True - ) + lambda: create_and_process_template_response(template, {}, use_middleware=True) ) print("Large page middleware test") @@ -156,15 +147,9 @@ class RenderBenchmarks(SimpleTestCase): @staticmethod def report_results(with_middleware, without_middleware): print(f"Middleware active\t\t{with_middleware:.3f} ms per iteration") - print( - f"Middleware inactive\t{without_middleware:.3f} ms per iteration" - ) + print(f"Middleware inactive\t{without_middleware:.3f} ms per iteration") time_difference = with_middleware - without_middleware if without_middleware > with_middleware: - print( - f"Decrease of {-100 * time_difference / with_middleware:.2f}%" - ) + print(f"Decrease of {-100 * time_difference / with_middleware:.2f}%") else: - print( - f"Increase of {100 * time_difference / without_middleware:.2f}%" - ) + print(f"Increase of {100 * time_difference / without_middleware:.2f}%") diff --git a/django_components/app_settings.py b/django_components/app_settings.py index 30daeab9..d4550e98 100644 --- a/django_components/app_settings.py +++ b/django_components/app_settings.py @@ -26,9 +26,7 @@ class AppSettings: @property def CONTEXT_BEHAVIOR(self): - raw_value = self.settings.setdefault( - "context_behavior", ContextBehavior.GLOBAL.value - ) + raw_value = self.settings.setdefault("context_behavior", ContextBehavior.GLOBAL.value) return self._validate_context_behavior(raw_value) def _validate_context_behavior(self, raw_value): @@ -36,9 +34,7 @@ class AppSettings: return ContextBehavior(raw_value) except ValueError: valid_values = [behavior.value for behavior in ContextBehavior] - raise ValueError( - f"Invalid context behavior: {raw_value}. Valid options are {valid_values}" - ) + raise ValueError(f"Invalid context behavior: {raw_value}. Valid options are {valid_values}") app_settings = AppSettings() diff --git a/django_components/component.py b/django_components/component.py index 0bbf905d..2aa0ff1f 100644 --- a/django_components/component.py +++ b/django_components/component.py @@ -80,9 +80,7 @@ class Component(View, metaclass=SimplifiedInterfaceMediaDefiningClass): self, registered_name: Optional[str] = None, outer_context: Optional[Context] = None, - fill_content: Union[ - DefaultFillContent, Iterable[NamedFillContent] - ] = (), + fill_content: Union[DefaultFillContent, Iterable[NamedFillContent]] = (), ): self.registered_name: Optional[str] = registered_name self.outer_context: Context = outer_context or Context() @@ -152,14 +150,10 @@ class Component(View, metaclass=SimplifiedInterfaceMediaDefiningClass): if slots_data: self._fill_slots(slots_data, escape_slots_content) - updated_filled_slots_context: FilledSlotsContext = ( - self._process_template_and_update_filled_slot_context( - context, template - ) + updated_filled_slots_context: FilledSlotsContext = self._process_template_and_update_filled_slot_context( + context, template ) - with context.update( - {FILLED_SLOTS_CONTENT_CONTEXT_KEY: updated_filled_slots_context} - ): + with context.update({FILLED_SLOTS_CONTENT_CONTEXT_KEY: updated_filled_slots_context}): return template.render(context) def render_to_response( @@ -201,19 +195,14 @@ class Component(View, metaclass=SimplifiedInterfaceMediaDefiningClass): named_fills_content = {} else: default_fill_content = None - named_fills_content = { - name: (nodelist, alias) - for name, nodelist, alias in self.fill_content - } + named_fills_content = {name: (nodelist, alias) for name, nodelist, alias in self.fill_content} # If value is `None`, then slot is unfilled. slot_name2fill_content: Dict[SlotName, Optional[FillContent]] = {} default_slot_encountered: bool = False required_slot_names: Set[str] = set() - for node in template.nodelist.get_nodes_by_type( - (SlotNode, IfSlotFilledConditionBranchNode) # type: ignore - ): + for node in template.nodelist.get_nodes_by_type((SlotNode, IfSlotFilledConditionBranchNode)): # type: ignore if isinstance(node, SlotNode): # Give slot node knowledge of its parent template. node.template = template @@ -225,9 +214,7 @@ class Component(View, metaclass=SimplifiedInterfaceMediaDefiningClass): f"To fix, check template '{template.name}' " f"of component '{self.registered_name}'." ) - content_data: Optional[FillContent] = ( - None # `None` -> unfilled - ) + content_data: Optional[FillContent] = None # `None` -> unfilled if node.is_required: required_slot_names.add(node.name) if node.is_default: @@ -245,9 +232,7 @@ class Component(View, metaclass=SimplifiedInterfaceMediaDefiningClass): elif isinstance(node, IfSlotFilledConditionBranchNode): node.template = template else: - raise RuntimeError( - f"Node of {type(node).__name__} does not require linking." - ) + raise RuntimeError(f"Node of {type(node).__name__} does not require linking.") # Check: Only component templates that include a 'default' slot # can be invoked with implicit filling. @@ -258,12 +243,8 @@ class Component(View, metaclass=SimplifiedInterfaceMediaDefiningClass): f"even though none of its slots is marked as 'default'." ) - unfilled_slots: Set[str] = set( - k for k, v in slot_name2fill_content.items() if v is None - ) - unmatched_fills: Set[str] = ( - named_fills_content.keys() - slot_name2fill_content.keys() - ) + unfilled_slots: Set[str] = set(k for k, v in slot_name2fill_content.items() if v is None) + unmatched_fills: Set[str] = named_fills_content.keys() - slot_name2fill_content.keys() # Check that 'required' slots are filled. for slot_name in unfilled_slots: @@ -286,9 +267,7 @@ class Component(View, metaclass=SimplifiedInterfaceMediaDefiningClass): # Higher values make matching stricter. This is probably preferable, as it # reduces false positives. for fill_name in unmatched_fills: - fuzzy_slot_name_matches = difflib.get_close_matches( - fill_name, unfilled_slots, n=1, cutoff=0.7 - ) + fuzzy_slot_name_matches = difflib.get_close_matches(fill_name, unfilled_slots, n=1, cutoff=0.7) msg = ( f"Component '{self.registered_name}' passed fill " f"that refers to undefined slot: '{fill_name}'." @@ -305,9 +284,7 @@ class Component(View, metaclass=SimplifiedInterfaceMediaDefiningClass): if content_data # Slots whose content is None (i.e. unfilled) are dropped. } try: - prev_context: FilledSlotsContext = context[ - FILLED_SLOTS_CONTENT_CONTEXT_KEY - ] + prev_context: FilledSlotsContext = context[FILLED_SLOTS_CONTENT_CONTEXT_KEY] return prev_context.new_child(filled_slots_map) except KeyError: return ChainMap(filled_slots_map) diff --git a/django_components/component_registry.py b/django_components/component_registry.py index eb983276..209592d7 100644 --- a/django_components/component_registry.py +++ b/django_components/component_registry.py @@ -12,13 +12,8 @@ class ComponentRegistry(object): def register(self, name=None, component=None): existing_component = self._registry.get(name) - if ( - existing_component - and existing_component.class_hash != component.class_hash - ): - raise AlreadyRegistered( - 'The component "%s" has already been registered' % name - ) + if existing_component and existing_component.class_hash != component.class_hash: + raise AlreadyRegistered('The component "%s" has already been registered' % name) self._registry[name] = component def unregister(self, name): diff --git a/django_components/management/commands/startcomponent.py b/django_components/management/commands/startcomponent.py index 746c5e9c..6054ebbd 100644 --- a/django_components/management/commands/startcomponent.py +++ b/django_components/management/commands/startcomponent.py @@ -9,9 +9,7 @@ class Command(BaseCommand): help = "Creates a new component" def add_arguments(self, parser): - parser.add_argument( - "name", type=str, help="The name of the component to create" - ) + parser.add_argument("name", type=str, help="The name of the component to create") parser.add_argument( "--path", type=str, @@ -71,9 +69,7 @@ class Command(BaseCommand): elif base_dir: component_path = os.path.join(base_dir, "components", name) else: - raise CommandError( - "You must specify a path or set BASE_DIR in your django settings" - ) + raise CommandError("You must specify a path or set BASE_DIR in your django settings") if os.path.exists(component_path): if force: @@ -84,11 +80,7 @@ class Command(BaseCommand): ) ) else: - self.stdout.write( - self.style.WARNING( - f'The component "{name}" already exists. Overwriting...' - ) - ) + self.stdout.write(self.style.WARNING(f'The component "{name}" already exists. Overwriting...')) else: raise CommandError( f'The component "{name}" already exists at {component_path}. Use --force to overwrite.' @@ -107,9 +99,7 @@ class Command(BaseCommand): ) f.write(script_content.strip()) - with open( - os.path.join(component_path, css_filename), "w" - ) as f: + with open(os.path.join(component_path, css_filename), "w") as f: style_content = dedent( f""" .component-{name} {{ @@ -119,9 +109,7 @@ class Command(BaseCommand): ) f.write(style_content.strip()) - with open( - os.path.join(component_path, template_filename), "w" - ) as f: + with open(os.path.join(component_path, template_filename), "w") as f: template_content = dedent( f"""
@@ -133,9 +121,7 @@ class Command(BaseCommand): ) f.write(template_content.strip()) - with open( - os.path.join(component_path, f"{name}.py"), "w" - ) as f: + with open(os.path.join(component_path, f"{name}.py"), "w") as f: py_content = dedent( f""" from django_components import component @@ -157,16 +143,8 @@ class Command(BaseCommand): f.write(py_content.strip()) if verbose: - self.stdout.write( - self.style.SUCCESS( - f"Successfully created {name} component at {component_path}" - ) - ) + self.stdout.write(self.style.SUCCESS(f"Successfully created {name} component at {component_path}")) else: - self.stdout.write( - self.style.SUCCESS( - f"Successfully created {name} component" - ) - ) + self.stdout.write(self.style.SUCCESS(f"Successfully created {name} component")) else: raise CommandError("You must specify a component name") diff --git a/django_components/middleware.py b/django_components/middleware.py index e230983a..4655398c 100644 --- a/django_components/middleware.py +++ b/django_components/middleware.py @@ -11,9 +11,7 @@ CSS_DEPENDENCY_PLACEHOLDER = '' JS_DEPENDENCY_PLACEHOLDER = '' SCRIPT_TAG_REGEX = re.compile("[\w\-/]+?) -->" -) +COMPONENT_COMMENT_REGEX = re.compile(rb"") PLACEHOLDER_REGEX = re.compile( rb"" rb'|' @@ -32,9 +30,7 @@ class ComponentDependencyMiddleware: def __call__(self, request): response = self.get_response(request) if ( - getattr(settings, "COMPONENTS", {}).get( - "RENDER_DEPENDENCIES", False - ) + getattr(settings, "COMPONENTS", {}).get("RENDER_DEPENDENCIES", False) and not isinstance(response, StreamingHttpResponse) and response.get("Content-Type", "").startswith("text/html") ): @@ -43,23 +39,12 @@ class ComponentDependencyMiddleware: def process_response_content(content): - component_names_seen = { - match.group("name") - for match in COMPONENT_COMMENT_REGEX.finditer(content) - } - all_components = [ - registry.get(name.decode("utf-8"))("") for name in component_names_seen - ] + component_names_seen = {match.group("name") for match in COMPONENT_COMMENT_REGEX.finditer(content)} + all_components = [registry.get(name.decode("utf-8"))("") for name in component_names_seen] all_media = join_media(all_components) - js_dependencies = b"".join( - media.encode("utf-8") for media in all_media.render_js() - ) - css_dependencies = b"".join( - media.encode("utf-8") for media in all_media.render_css() - ) - return PLACEHOLDER_REGEX.sub( - DependencyReplacer(css_dependencies, js_dependencies), content - ) + js_dependencies = b"".join(media.encode("utf-8") for media in all_media.render_js()) + css_dependencies = b"".join(media.encode("utf-8") for media in all_media.render_css()) + return PLACEHOLDER_REGEX.sub(DependencyReplacer(css_dependencies, js_dependencies), content) def add_module_attribute_to_scripts(scripts): diff --git a/django_components/safer_staticfiles/apps.py b/django_components/safer_staticfiles/apps.py index 28c3b623..e538d094 100644 --- a/django_components/safer_staticfiles/apps.py +++ b/django_components/safer_staticfiles/apps.py @@ -12,9 +12,7 @@ class SaferStaticFilesConfig(StaticFilesConfig): by the static file server. """ - default = ( - True # Ensure that _this_ app is registered, as opposed to parent cls. - ) + default = True # Ensure that _this_ app is registered, as opposed to parent cls. ignore_patterns = StaticFilesConfig.ignore_patterns + [ "*.py", "*.html", diff --git a/django_components/templatetags/component_tags.py b/django_components/templatetags/component_tags.py index 073e21ad..40010707 100644 --- a/django_components/templatetags/component_tags.py +++ b/django_components/templatetags/component_tags.py @@ -9,13 +9,7 @@ else: import django.template from django.conf import settings from django.template import Context, Template -from django.template.base import ( - FilterExpression, - Node, - NodeList, - TextNode, - TokenType, -) +from django.template.base import FilterExpression, Node, NodeList, TextNode, TokenType from django.template.defaulttags import CommentNode from django.template.exceptions import TemplateSyntaxError from django.template.library import parse_bits @@ -24,10 +18,7 @@ from django.utils.safestring import mark_safe from django_components.app_settings import app_settings from django_components.component_registry import ComponentRegistry from django_components.component_registry import registry as component_registry -from django_components.middleware import ( - CSS_DEPENDENCY_PLACEHOLDER, - JS_DEPENDENCY_PLACEHOLDER, -) +from django_components.middleware import CSS_DEPENDENCY_PLACEHOLDER, JS_DEPENDENCY_PLACEHOLDER if TYPE_CHECKING: from django_components.component import Component @@ -88,16 +79,8 @@ def component_dependencies_tag(preload=""): if is_dependency_middleware_active(): preloaded_dependencies = [] for component in get_components_from_preload_str(preload): - preloaded_dependencies.append( - RENDERED_COMMENT_TEMPLATE.format( - name=component.registered_name - ) - ) - return mark_safe( - "\n".join(preloaded_dependencies) - + CSS_DEPENDENCY_PLACEHOLDER - + JS_DEPENDENCY_PLACEHOLDER - ) + preloaded_dependencies.append(RENDERED_COMMENT_TEMPLATE.format(name=component.registered_name)) + return mark_safe("\n".join(preloaded_dependencies) + CSS_DEPENDENCY_PLACEHOLDER + JS_DEPENDENCY_PLACEHOLDER) else: rendered_dependencies = [] for component in get_components_from_registry(component_registry): @@ -113,14 +96,8 @@ def component_css_dependencies_tag(preload=""): if is_dependency_middleware_active(): preloaded_dependencies = [] for component in get_components_from_preload_str(preload): - preloaded_dependencies.append( - RENDERED_COMMENT_TEMPLATE.format( - name=component.registered_name - ) - ) - return mark_safe( - "\n".join(preloaded_dependencies) + CSS_DEPENDENCY_PLACEHOLDER - ) + preloaded_dependencies.append(RENDERED_COMMENT_TEMPLATE.format(name=component.registered_name)) + return mark_safe("\n".join(preloaded_dependencies) + CSS_DEPENDENCY_PLACEHOLDER) else: rendered_dependencies = [] for component in get_components_from_registry(component_registry): @@ -136,14 +113,8 @@ def component_js_dependencies_tag(preload=""): if is_dependency_middleware_active(): preloaded_dependencies = [] for component in get_components_from_preload_str(preload): - preloaded_dependencies.append( - RENDERED_COMMENT_TEMPLATE.format( - name=component.registered_name - ) - ) - return mark_safe( - "\n".join(preloaded_dependencies) + JS_DEPENDENCY_PLACEHOLDER - ) + preloaded_dependencies.append(RENDERED_COMMENT_TEMPLATE.format(name=component.registered_name)) + return mark_safe("\n".join(preloaded_dependencies) + JS_DEPENDENCY_PLACEHOLDER) else: rendered_dependencies = [] for component in get_components_from_registry(component_registry): @@ -151,6 +122,7 @@ def component_js_dependencies_tag(preload=""): return mark_safe("\n".join(rendered_dependencies)) + class UserSlotVar: """ Extensible mechanism for offering 'fill' blocks in template access to properties @@ -216,24 +188,17 @@ class SlotNode(Node, TemplateAwareNodeMixin): def render(self, context): try: - filled_slots_map: FilledSlotsContext = context[ - FILLED_SLOTS_CONTENT_CONTEXT_KEY - ] + filled_slots_map: FilledSlotsContext = context[FILLED_SLOTS_CONTENT_CONTEXT_KEY] except KeyError: - raise TemplateSyntaxError( - f"Attempted to render SlotNode '{self.name}' outside a parent component." - ) + raise TemplateSyntaxError(f"Attempted to render SlotNode '{self.name}' outside a parent component.") extra_context = {} try: - slot_fill_content: Optional[FillContent] = filled_slots_map[ - (self.name, self.template) - ] + slot_fill_content: Optional[FillContent] = filled_slots_map[(self.name, self.template)] except KeyError: if self.is_required: raise TemplateSyntaxError( - f"Slot '{self.name}' is marked as 'required' (i.e. non-optional), " - f"yet no fill is provided. " + f"Slot '{self.name}' is marked as 'required' (i.e. non-optional), " f"yet no fill is provided. " ) nodelist = self.nodelist else: @@ -257,9 +222,7 @@ def do_slot(parser, token): if 1 <= len(args) <= 3: slot_name, *options = args if not is_wrapped_in_quotes(slot_name): - raise TemplateSyntaxError( - f"'{bits[0]}' name must be a string 'literal'." - ) + raise TemplateSyntaxError(f"'{bits[0]}' name must be a string 'literal'.") slot_name = strip_quotes(slot_name) modifiers_count = len(options) if SLOT_REQUIRED_OPTION_KEYWORD in options: @@ -273,9 +236,7 @@ def do_slot(parser, token): SLOT_REQUIRED_OPTION_KEYWORD, SLOT_DEFAULT_OPTION_KEYWORD, ] - raise TemplateSyntaxError( - f"Invalid options passed to 'slot' tag. Valid choices: {keywords}." - ) + raise TemplateSyntaxError(f"Invalid options passed to 'slot' tag. Valid choices: {keywords}.") else: raise TemplateSyntaxError( "'slot' tag does not match pattern " @@ -354,14 +315,10 @@ def do_fill(parser, token): elif len(args) == 3: tgt_slot_name, as_keyword, alias = args if as_keyword.lower() != "as": - raise TemplateSyntaxError( - f"{tag} tag args do not conform to pattern ' as '" - ) + raise TemplateSyntaxError(f"{tag} tag args do not conform to pattern ' as '") alias_fexp = FilterExpression(alias, parser) else: - raise TemplateSyntaxError( - f"'{tag}' tag takes either 1 or 3 arguments: Received {len(args)}." - ) + raise TemplateSyntaxError(f"'{tag}' tag takes either 1 or 3 arguments: Received {len(args)}.") nodelist = parser.parse(parse_until=["endfill"]) parser.delete_first_token() @@ -397,27 +354,18 @@ class ComponentNode(Node): def __repr__(self): return "" % ( self.name_fexp, - getattr( - self, "nodelist", None - ), # 'nodelist' attribute only assigned later. + getattr(self, "nodelist", None), # 'nodelist' attribute only assigned later. ) def render(self, context: Context): resolved_component_name = self.name_fexp.resolve(context) - component_cls: Type[Component] = component_registry.get( - resolved_component_name - ) + component_cls: Type[Component] = component_registry.get(resolved_component_name) # Resolve FilterExpressions and Variables that were passed as args to the # component, then call component's context method # to get values to insert into the context - resolved_context_args = [ - safe_resolve(arg, context) for arg in self.context_args - ] - resolved_context_kwargs = { - key: safe_resolve(kwarg, context) - for key, kwarg in self.context_kwargs.items() - } + resolved_context_args = [safe_resolve(arg, context) for arg in self.context_args] + resolved_context_kwargs = {key: safe_resolve(kwarg, context) for key, kwarg in self.context_kwargs.items()} if isinstance(self.fill_nodes, ImplicitFillNode): fill_content = self.fill_nodes.nodelist @@ -437,9 +385,7 @@ class ComponentNode(Node): ) else: resolved_alias: None = None - fill_content.append( - (resolved_name, fill_node.nodelist, resolved_alias) - ) + fill_content.append((resolved_name, fill_node.nodelist, resolved_alias)) component: Component = component_cls( registered_name=resolved_component_name, @@ -447,9 +393,7 @@ class ComponentNode(Node): fill_content=fill_content, ) - component_context: dict = component.get_context_data( - *resolved_context_args, **resolved_context_kwargs - ) + component_context: dict = component.get_context_data(*resolved_context_args, **resolved_context_kwargs) if self.isolated_context: context = context.new() @@ -457,10 +401,7 @@ class ComponentNode(Node): rendered_component = component.render(context) if is_dependency_middleware_active(): - return ( - RENDERED_COMMENT_TEMPLATE.format(name=resolved_component_name) - + rendered_component - ) + return RENDERED_COMMENT_TEMPLATE.format(name=resolved_component_name) + rendered_component else: return rendered_component @@ -482,9 +423,7 @@ def do_component_block(parser, token): bits = token.split_contents() bits, isolated_context = check_for_isolated_context_keyword(bits) - component_name, context_args, context_kwargs = parse_component_with_args( - parser, bits, "component_block" - ) + component_name, context_args, context_kwargs = parse_component_with_args(parser, bits, "component_block") body: NodeList = parser.parse(parse_until=["endcomponent_block"]) parser.delete_first_token() fill_nodes = () @@ -575,10 +514,7 @@ def is_whitespace_token(token): def is_block_tag_token(token, name): - return ( - token.token_type == TokenType.BLOCK - and token.split_contents()[0] == name - ) + return token.token_type == TokenType.BLOCK and token.split_contents()[0] == name @register.tag(name="if_filled") @@ -610,9 +546,7 @@ def do_if_filled_block(parser, token): slot_name, is_positive = parse_if_filled_bits(bits) nodelist = parser.parse(("elif_filled", "else_filled", "endif_filled")) branches: List[_IfSlotFilledBranchNode] = [ - IfSlotFilledConditionBranchNode( - slot_name=slot_name, nodelist=nodelist, is_positive=is_positive - ) + IfSlotFilledConditionBranchNode(slot_name=slot_name, nodelist=nodelist, is_positive=is_positive) ] token = parser.next_token() @@ -621,13 +555,9 @@ def do_if_filled_block(parser, token): while token.contents.startswith("elif_filled"): bits = token.split_contents() slot_name, is_positive = parse_if_filled_bits(bits) - nodelist: NodeList = parser.parse( - ("elif_filled", "else_filled", "endif_filled") - ) + nodelist: NodeList = parser.parse(("elif_filled", "else_filled", "endif_filled")) branches.append( - IfSlotFilledConditionBranchNode( - slot_name=slot_name, nodelist=nodelist, is_positive=is_positive - ) + IfSlotFilledConditionBranchNode(slot_name=slot_name, nodelist=nodelist, is_positive=is_positive) ) token = parser.next_token() @@ -656,9 +586,7 @@ def parse_if_filled_bits( tag, args = bits[0], bits[1:] if tag in ("else_filled", "endif_filled"): if len(args) != 0: - raise TemplateSyntaxError( - f"Tag '{tag}' takes no arguments. Received '{' '.join(args)}'" - ) + raise TemplateSyntaxError(f"Tag '{tag}' takes no arguments. Received '{' '.join(args)}'") else: return None, None if len(args) == 1: @@ -669,13 +597,10 @@ def parse_if_filled_bits( is_positive = bool_from_string(args[1]) else: raise TemplateSyntaxError( - f"{bits[0]} tag arguments '{' '.join(args)}' do not match pattern " - f"' ()'" + f"{bits[0]} tag arguments '{' '.join(args)}' do not match pattern " f"' ()'" ) if not is_wrapped_in_quotes(slot_name): - raise TemplateSyntaxError( - f"First argument of '{bits[0]}' must be a quoted string 'literal'." - ) + raise TemplateSyntaxError(f"First argument of '{bits[0]}' must be a quoted string 'literal'.") slot_name = strip_quotes(slot_name) return slot_name, is_positive @@ -691,9 +616,7 @@ class _IfSlotFilledBranchNode(Node): raise NotImplementedError -class IfSlotFilledConditionBranchNode( - _IfSlotFilledBranchNode, TemplateAwareNodeMixin -): +class IfSlotFilledConditionBranchNode(_IfSlotFilledBranchNode, TemplateAwareNodeMixin): def __init__( self, slot_name: str, @@ -706,9 +629,7 @@ class IfSlotFilledConditionBranchNode( def evaluate(self, context) -> bool: try: - filled_slots: FilledSlotsContext = context[ - FILLED_SLOTS_CONTENT_CONTEXT_KEY - ] + filled_slots: FilledSlotsContext = context[FILLED_SLOTS_CONTENT_CONTEXT_KEY] except KeyError: raise TemplateSyntaxError( f"Attempted to render {type(self).__name__} outside a Component rendering context." @@ -777,9 +698,7 @@ def parse_component_with_args(parser, bits, tag_name): ) if tag_name != tag_args[0].token: - raise RuntimeError( - f"Internal error: Expected tag_name to be {tag_name}, but it was {tag_args[0].token}" - ) + raise RuntimeError(f"Internal error: Expected tag_name to be {tag_name}, but it was {tag_args[0].token}") if len(tag_args) > 1: # At least one position arg, so take the first as the component name component_name = tag_args[1].token @@ -791,9 +710,7 @@ def parse_component_with_args(parser, bits, tag_name): context_args = [] context_kwargs = tag_kwargs except IndexError: - raise TemplateSyntaxError( - f"Call the '{tag_name}' tag with a component name as the first parameter" - ) + raise TemplateSyntaxError(f"Call the '{tag_name}' tag with a component name as the first parameter") return component_name, context_args, context_kwargs @@ -801,11 +718,7 @@ def parse_component_with_args(parser, bits, tag_name): def safe_resolve(context_item, context): """Resolve FilterExpressions and Variables in context if possible. Return other items unchanged.""" - return ( - context_item.resolve(context) - if hasattr(context_item, "resolve") - else context_item - ) + return context_item.resolve(context) if hasattr(context_item, "resolve") else context_item def is_wrapped_in_quotes(s): @@ -813,9 +726,7 @@ def is_wrapped_in_quotes(s): def is_dependency_middleware_active(): - return getattr(settings, "COMPONENTS", {}).get( - "RENDER_DEPENDENCIES", False - ) + return getattr(settings, "COMPONENTS", {}).get("RENDER_DEPENDENCIES", False) def norm_and_validate_name(name: str, tag: str, context: Optional[str] = None): @@ -826,10 +737,7 @@ def norm_and_validate_name(name: str, tag: str, context: Optional[str] = None): name = strip_quotes(name) if not name.isidentifier(): context = f" in '{context}'" if context else "" - raise TemplateSyntaxError( - f"{tag} name '{name}'{context} " - "is not a valid Python identifier." - ) + raise TemplateSyntaxError(f"{tag} name '{name}'{context} " "is not a valid Python identifier.") return name diff --git a/pyproject.toml b/pyproject.toml index b77ea258..3291558c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.black] -line-length = 79 +line-length = 119 include = '\.pyi?$' exclude = ''' /( @@ -18,7 +18,21 @@ exclude = ''' [tool.isort] profile = "black" -line_length = 79 +line_length = 119 multi_line_output = 3 include_trailing_comma = "True" known_first_party = "django_components" + +[tool.flake8] +ignore = ['E302', 'W503'] +max-line-length = 119 +exclude = [ + 'migrations', + '__pycache__', + 'manage.py', + 'settings.py', + 'env', + '.env', + '.venv', + '.tox', +] \ No newline at end of file diff --git a/requirements-dev.in b/requirements-dev.in index b7968eb5..413f4750 100644 --- a/requirements-dev.in +++ b/requirements-dev.in @@ -2,5 +2,7 @@ django tox pytest flake8 +flake8-pyproject isort -pre-commit \ No newline at end of file +pre-commit +black \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt index 63f082a4..809e7cd4 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,12 +6,16 @@ # asgiref==3.7.2 # via django +black==24.1.1 + # via -r requirements-dev.in cachetools==5.3.2 # via tox cfgv==3.4.0 # via pre-commit chardet==5.2.0 # via tox +click==8.1.7 + # via black colorama==0.4.6 # via tox distlib==0.3.8 @@ -23,6 +27,10 @@ filelock==3.13.1 # tox # virtualenv flake8==7.0.0 + # via + # -r requirements-dev.in + # flake8-pyproject +flake8-pyproject==1.2.3 # via -r requirements-dev.in identify==2.5.33 # via pre-commit @@ -32,15 +40,21 @@ isort==5.13.2 # via -r requirements-dev.in mccabe==0.7.0 # via flake8 +mypy-extensions==1.0.0 + # via black nodeenv==1.8.0 # via pre-commit packaging==23.2 # via + # black # pyproject-api # pytest # tox +pathspec==0.12.1 + # via black platformdirs==4.1.0 # via + # black # tox # virtualenv pluggy==1.3.0 diff --git a/scripts/supported_versions.py b/scripts/supported_versions.py index 8f00999a..2d8f4061 100644 --- a/scripts/supported_versions.py +++ b/scripts/supported_versions.py @@ -30,9 +30,7 @@ def get_supported_versions(url): django_to_python = { version_to_tuple(python_version): [ version_to_tuple(version_string) - for version_string in re.findall( - r"(? None: @@ -125,10 +93,5 @@ class TestBaseDir(SimpleTestCase): current_engine = Engine.get_default() loader = Loader(current_engine) dirs = loader.get_dirs() - expected = [ - Path(__file__).parent.resolve() - / "test_structures" - / "test_structure_1" - / "components" - ] + expected = [Path(__file__).parent.resolve() / "test_structures" / "test_structure_1" / "components"] self.assertEqual(dirs, expected) diff --git a/tests/test_component.py b/tests/test_component.py index c35fbfde..5fce4d60 100644 --- a/tests/test_component.py +++ b/tests/test_component.py @@ -234,9 +234,7 @@ class InlineComponentTest(SimpleTestCase): css = "path/to/style.css" js = "path/to/script.js" - comp = HTMLStringFileCSSJSComponent( - "html_string_file_css_js_component" - ) + comp = HTMLStringFileCSSJSComponent("html_string_file_css_js_component") self.assertHTMLEqual( comp.render(Context({})), "
Content
", @@ -259,9 +257,7 @@ class InlineComponentTest(SimpleTestCase): class Media: css = "path/to/style.css" - comp = HTMLStringFileCSSJSComponent( - "html_string_file_css_js_component" - ) + comp = HTMLStringFileCSSJSComponent("html_string_file_css_js_component") self.assertHTMLEqual( comp.render(Context({})), "
Content
", @@ -284,9 +280,7 @@ class InlineComponentTest(SimpleTestCase): class Media: js = "path/to/script.js" - comp = HTMLStringFileCSSJSComponent( - "html_string_file_css_js_component" - ) + comp = HTMLStringFileCSSJSComponent("html_string_file_css_js_component") self.assertHTMLEqual( comp.render(Context({})), "
Content
", @@ -303,9 +297,7 @@ class InlineComponentTest(SimpleTestCase): def test_component_with_variable_in_html(self): class VariableHTMLComponent(component.Component): def get_template(self, context): - return Template( - "
{{ variable }}
" - ) + return Template("
{{ variable }}
") comp = VariableHTMLComponent("variable_html_component") context = Context({"variable": "Dynamic Content"}) diff --git a/tests/test_component_as_view.py b/tests/test_component_as_view.py index 7d737f5a..4b2deff5 100644 --- a/tests/test_component_as_view.py +++ b/tests/test_component_as_view.py @@ -49,9 +49,7 @@ class MockComponentSlot(component.Component): """ def get(self, request, *args, **kwargs) -> HttpResponse: - return self.render_to_response( - {"name": "Bob"}, {"second_slot": "Nice to meet you, Bob"} - ) + return self.render_to_response({"name": "Bob"}, {"second_slot": "Nice to meet you, Bob"}) @component.register("testcomponent_context_insecure") @@ -64,9 +62,7 @@ class MockInsecureComponentContext(component.Component): """ def get(self, request, *args, **kwargs) -> HttpResponse: - return self.render_to_response( - {"variable": ""} - ) + return self.render_to_response({"variable": ""}) @component.register("testcomponent_slot_insecure") @@ -80,9 +76,7 @@ class MockInsecureComponentSlot(component.Component): """ def get(self, request, *args, **kwargs) -> HttpResponse: - return self.render_to_response( - {}, {"test_slot": ""} - ) + return self.render_to_response({}, {"test_slot": ""}) def render_template_view(request): diff --git a/tests/test_context.py b/tests/test_context.py index 7d77a960..dfe30159 100644 --- a/tests/test_context.py +++ b/tests/test_context.py @@ -65,15 +65,11 @@ class OuterContextComponent(component.Component): component.registry.register(name="parent_component", component=ParentComponent) -component.registry.register( - name="parent_with_args", component=ParentComponentWithArgs -) +component.registry.register(name="parent_with_args", component=ParentComponentWithArgs) component.registry.register(name="variable_display", component=VariableDisplay) component.registry.register(name="incrementer", component=IncrementerComponent) component.registry.register(name="simple_component", component=SimpleComponent) -component.registry.register( - name="outer_context_component", component=OuterContextComponent -) +component.registry.register(name="outer_context_component", component=OuterContextComponent) class ContextTests(SimpleTestCase): @@ -86,17 +82,13 @@ class ContextTests(SimpleTestCase): ) rendered = template.render(Context()) - self.assertIn( - "

Shadowing variable = override

", rendered, rendered - ) + self.assertIn("

Shadowing variable = override

", rendered, rendered) self.assertIn( "

Shadowing variable = slot_default_override

", rendered, rendered, ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) def test_nested_component_instances_have_unique_context_with_unfilled_slots_and_component_tag( self, @@ -107,9 +99,7 @@ class ContextTests(SimpleTestCase): ) rendered = template.render(Context()) - self.assertIn( - "

Uniquely named variable = unique_val

", rendered, rendered - ) + self.assertIn("

Uniquely named variable = unique_val

", rendered, rendered) self.assertIn( "

Uniquely named variable = slot_default_unique

", rendered, @@ -125,17 +115,13 @@ class ContextTests(SimpleTestCase): ) rendered = template.render(Context()) - self.assertIn( - "

Shadowing variable = override

", rendered, rendered - ) + self.assertIn("

Shadowing variable = override

", rendered, rendered) self.assertIn( "

Shadowing variable = slot_default_override

", rendered, rendered, ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) def test_nested_component_instances_have_unique_context_with_unfilled_slots_and_component_block_tag( self, @@ -146,9 +132,7 @@ class ContextTests(SimpleTestCase): ) rendered = template.render(Context()) - self.assertIn( - "

Uniquely named variable = unique_val

", rendered, rendered - ) + self.assertIn("

Uniquely named variable = unique_val

", rendered, rendered) self.assertIn( "

Uniquely named variable = slot_default_unique

", rendered, @@ -156,7 +140,8 @@ class ContextTests(SimpleTestCase): ) def test_nested_component_context_shadows_parent_with_filled_slots(self): - template = Template(""" + template = Template( + """ {% load component_tags %}{% component_dependencies %} {% component_block 'parent_component' %} {% fill 'content' %} @@ -164,25 +149,23 @@ class ContextTests(SimpleTestCase): {% endcomponent_block %} {% endfill %} {% endcomponent_block %} - """) # NOQA + """ # NOQA + ) rendered = template.render(Context()) - self.assertIn( - "

Shadowing variable = override

", rendered, rendered - ) + self.assertIn("

Shadowing variable = override

", rendered, rendered) self.assertIn( "

Shadowing variable = shadow_from_slot

", rendered, rendered, ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) def test_nested_component_instances_have_unique_context_with_filled_slots( self, ): - template = Template(""" + template = Template( + """ {% load component_tags %}{% component_dependencies %} {% component_block 'parent_component' %} {% fill 'content' %} @@ -190,12 +173,11 @@ class ContextTests(SimpleTestCase): {% endcomponent_block %} {% endfill %} {% endcomponent_block %} - """) # NOQA + """ # NOQA + ) rendered = template.render(Context()) - self.assertIn( - "

Uniquely named variable = unique_val

", rendered, rendered - ) + self.assertIn("

Uniquely named variable = unique_val

", rendered, rendered) self.assertIn( "

Uniquely named variable = unique_from_slot

", rendered, @@ -209,21 +191,15 @@ class ContextTests(SimpleTestCase): "{% load component_tags %}{% component_dependencies %}" "{% component_block name='parent_component' %}{% endcomponent_block %}" ) - rendered = template.render( - Context({"shadowing_variable": "NOT SHADOWED"}) - ) + rendered = template.render(Context({"shadowing_variable": "NOT SHADOWED"})) - self.assertIn( - "

Shadowing variable = override

", rendered, rendered - ) + self.assertIn("

Shadowing variable = override

", rendered, rendered) self.assertIn( "

Shadowing variable = slot_default_override

", rendered, rendered, ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) def test_nested_component_context_shadows_outer_context_with_unfilled_slots_and_component_block_tag( self, @@ -232,26 +208,21 @@ class ContextTests(SimpleTestCase): "{% load component_tags %}{% component_dependencies %}" "{% component_block 'parent_component' %}{% endcomponent_block %}" ) - rendered = template.render( - Context({"shadowing_variable": "NOT SHADOWED"}) - ) + rendered = template.render(Context({"shadowing_variable": "NOT SHADOWED"})) - self.assertIn( - "

Shadowing variable = override

", rendered, rendered - ) + self.assertIn("

Shadowing variable = override

", rendered, rendered) self.assertIn( "

Shadowing variable = slot_default_override

", rendered, rendered, ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) def test_nested_component_context_shadows_outer_context_with_filled_slots( self, ): - template = Template(""" + template = Template( + """ {% load component_tags %}{% component_dependencies %} {% component_block 'parent_component' %} {% fill 'content' %} @@ -259,22 +230,17 @@ class ContextTests(SimpleTestCase): {% endcomponent_block %} {% endfill %} {% endcomponent_block %} - """) # NOQA - rendered = template.render( - Context({"shadowing_variable": "NOT SHADOWED"}) + """ # NOQA ) + rendered = template.render(Context({"shadowing_variable": "NOT SHADOWED"})) - self.assertIn( - "

Shadowing variable = override

", rendered, rendered - ) + self.assertIn("

Shadowing variable = override

", rendered, rendered) self.assertIn( "

Shadowing variable = shadow_from_slot

", rendered, rendered, ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) class ParentArgsTests(SimpleTestCase): @@ -286,15 +252,9 @@ class ParentArgsTests(SimpleTestCase): ) rendered = template.render(Context({"parent_value": "passed_in"})) - self.assertIn( - "

Shadowing variable = passed_in

", rendered, rendered - ) - self.assertIn( - "

Uniquely named variable = passed_in

", rendered, rendered - ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertIn("

Shadowing variable = passed_in

", rendered, rendered) + self.assertIn("

Uniquely named variable = passed_in

", rendered, rendered) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) def test_parent_args_available_outside_slots(self): template = Template( @@ -303,18 +263,13 @@ class ParentArgsTests(SimpleTestCase): ) rendered = template.render(Context()) - self.assertIn( - "

Shadowing variable = passed_in

", rendered, rendered - ) - self.assertIn( - "

Uniquely named variable = passed_in

", rendered, rendered - ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertIn("

Shadowing variable = passed_in

", rendered, rendered) + self.assertIn("

Uniquely named variable = passed_in

", rendered, rendered) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) def test_parent_args_available_in_slots(self): - template = Template(""" + template = Template( + """ {% load component_tags %}{% component_dependencies %} {% component_block 'parent_with_args' parent_value='passed_in' %} {% fill 'content' %} @@ -322,18 +277,13 @@ class ParentArgsTests(SimpleTestCase): {% endcomponent_block %} {% endfill %} {% endcomponent_block %} - """) # NOQA + """ # NOQA + ) rendered = template.render(Context()) - self.assertIn( - "

Shadowing variable = value_from_slot

", rendered, rendered - ) - self.assertIn( - "

Uniquely named variable = passed_in

", rendered, rendered - ) - self.assertNotIn( - "

Shadowing variable = NOT SHADOWED

", rendered, rendered - ) + self.assertIn("

Shadowing variable = value_from_slot

", rendered, rendered) + self.assertIn("

Uniquely named variable = passed_in

", rendered, rendered) + self.assertNotIn("

Shadowing variable = NOT SHADOWED

", rendered, rendered) class ContextCalledOnceTests(SimpleTestCase): @@ -344,9 +294,7 @@ class ContextCalledOnceTests(SimpleTestCase): ) rendered = template.render(Context()).strip() - self.assertEqual( - rendered, '

value=1;calls=1

', rendered - ) + self.assertEqual(rendered, '

value=1;calls=1

', rendered) def test_one_context_call_with_simple_component_and_arg(self): template = Template( @@ -354,31 +302,21 @@ class ContextCalledOnceTests(SimpleTestCase): ) rendered = template.render(Context()).strip() - self.assertEqual( - rendered, '

value=3;calls=1

', rendered - ) + self.assertEqual(rendered, '

value=3;calls=1

', rendered) def test_one_context_call_with_component_block(self): - template = Template( - "{% load component_tags %}" - "{% component_block 'incrementer' %}{% endcomponent_block %}" - ) + template = Template("{% load component_tags %}" "{% component_block 'incrementer' %}{% endcomponent_block %}") rendered = template.render(Context()).strip() - self.assertEqual( - rendered, '

value=1;calls=1

', rendered - ) + self.assertEqual(rendered, '

value=1;calls=1

', rendered) def test_one_context_call_with_component_block_and_arg(self): template = Template( - "{% load component_tags %}" - "{% component_block 'incrementer' value='3' %}{% endcomponent_block %}" + "{% load component_tags %}" "{% component_block 'incrementer' value='3' %}{% endcomponent_block %}" ) rendered = template.render(Context()).strip() - self.assertEqual( - rendered, '

value=4;calls=1

', rendered - ) + self.assertEqual(rendered, '

value=4;calls=1

', rendered) def test_one_context_call_with_slot(self): template = Template( @@ -415,9 +353,7 @@ class ComponentsCanAccessOuterContext(SimpleTestCase): "{% load component_tags %}{% component_dependencies %}" "{% component_block 'simple_component' %}{% endcomponent_block %}" ) - rendered = template.render( - Context({"variable": "outer_value"}) - ).strip() + rendered = template.render(Context({"variable": "outer_value"})).strip() self.assertIn("outer_value", rendered, rendered) @@ -427,9 +363,7 @@ class IsolatedContextTests(SimpleTestCase): "{% load component_tags %}{% component_dependencies %}" "{% component_block 'simple_component' variable only %}{% endcomponent_block %}" ) - rendered = template.render( - Context({"variable": "outer_value"}) - ).strip() + rendered = template.render(Context({"variable": "outer_value"})).strip() self.assertIn("outer_value", rendered, rendered) def test_simple_component_cannot_use_outer_context(self): @@ -437,9 +371,7 @@ class IsolatedContextTests(SimpleTestCase): "{% load component_tags %}{% component_dependencies %}" "{% component_block 'simple_component' only %}{% endcomponent_block %}" ) - rendered = template.render( - Context({"variable": "outer_value"}) - ).strip() + rendered = template.render(Context({"variable": "outer_value"})).strip() self.assertNotIn("outer_value", rendered, rendered) @@ -504,9 +436,7 @@ class OuterContextPropertyTests(SimpleTestCase): "{% load component_tags %}{% component_dependencies %}" "{% component_block 'outer_context_component' only %}{% endcomponent_block %}" ) - rendered = template.render( - Context({"variable": "outer_value"}) - ).strip() + rendered = template.render(Context({"variable": "outer_value"})).strip() self.assertIn("outer_value", rendered, rendered) def test_outer_context_property_with_component_block(self): @@ -514,7 +444,5 @@ class OuterContextPropertyTests(SimpleTestCase): "{% load component_tags %}{% component_dependencies %}" "{% component_block 'outer_context_component' only %}{% endcomponent_block %}" ) - rendered = template.render( - Context({"variable": "outer_value"}) - ).strip() + rendered = template.render(Context({"variable": "outer_value"})).strip() self.assertIn("outer_value", rendered, rendered) diff --git a/tests/test_dependency_rendering.py b/tests/test_dependency_rendering.py index ecae89e3..83c8514c 100644 --- a/tests/test_dependency_rendering.py +++ b/tests/test_dependency_rendering.py @@ -52,9 +52,7 @@ class ComponentMediaRenderingTests(SimpleTestCase): def test_no_dependencies_when_no_components_used(self): component.registry.register(name="test", component=SimpleComponent) - template = Template( - "{% load component_tags %}{% component_dependencies %}" - ) + template = Template("{% load component_tags %}{% component_dependencies %}") rendered = create_and_process_template_response(template) self.assertInHTML('