mirror of
https://github.com/django-components/django-components.git
synced 2025-11-23 07:45:21 +00:00
feat: allow to set comp defaults on Kwargs class
This commit is contained in:
parent
c37628dea0
commit
7d259ac291
11 changed files with 560 additions and 119 deletions
|
|
@ -1,8 +1,9 @@
|
|||
from dataclasses import field
|
||||
from dataclasses import dataclass, field
|
||||
from typing import NamedTuple
|
||||
|
||||
from django.template import Context
|
||||
|
||||
from django_components import Component, Default
|
||||
from django_components import Component, Default, get_component_defaults
|
||||
from django_components.testing import djc_test
|
||||
|
||||
from .testutils import setup_test_config
|
||||
|
|
@ -169,3 +170,255 @@ class TestComponentDefaults:
|
|||
)
|
||||
|
||||
assert did_call_context
|
||||
|
||||
def test_defaults_from_kwargs_namedtuple(self):
|
||||
did_call_context = False
|
||||
|
||||
class TestComponent(Component):
|
||||
template = ""
|
||||
|
||||
class Kwargs(NamedTuple):
|
||||
another: int
|
||||
variable: str = "default_from_kwargs"
|
||||
|
||||
def get_template_data(self, args, kwargs, slots, context):
|
||||
nonlocal did_call_context
|
||||
did_call_context = True
|
||||
|
||||
assert self.raw_kwargs == {
|
||||
"variable": "default_from_kwargs",
|
||||
"another": 123,
|
||||
}
|
||||
return {}
|
||||
|
||||
TestComponent.render(
|
||||
kwargs={"another": 123},
|
||||
)
|
||||
|
||||
assert did_call_context
|
||||
|
||||
def test_defaults_from_kwargs_dataclass(self):
|
||||
did_call_context = False
|
||||
|
||||
class TestComponent(Component):
|
||||
template = ""
|
||||
|
||||
@dataclass
|
||||
class Kwargs:
|
||||
another: int
|
||||
variable: str = "default_from_kwargs"
|
||||
|
||||
def get_template_data(self, args, kwargs, slots, context):
|
||||
nonlocal did_call_context
|
||||
did_call_context = True
|
||||
|
||||
assert self.raw_kwargs == {
|
||||
"variable": "default_from_kwargs",
|
||||
"another": 123,
|
||||
}
|
||||
return {}
|
||||
|
||||
TestComponent.render(
|
||||
kwargs={"another": 123},
|
||||
)
|
||||
|
||||
assert did_call_context
|
||||
|
||||
def test_defaults_from_kwargs_other_class(self):
|
||||
did_call_context = False
|
||||
|
||||
class CustomKwargs:
|
||||
def __init__(self, **kwargs):
|
||||
for key, value in kwargs.items():
|
||||
setattr(self, key, value)
|
||||
self._kwargs = kwargs
|
||||
|
||||
def _asdict(self):
|
||||
return self._kwargs
|
||||
|
||||
class TestComponent(Component):
|
||||
template = ""
|
||||
|
||||
class Kwargs(CustomKwargs):
|
||||
another: int
|
||||
variable: str = "default_from_kwargs"
|
||||
|
||||
def get_template_data(self, args, kwargs, slots, context):
|
||||
nonlocal did_call_context
|
||||
did_call_context = True
|
||||
|
||||
# No defaults should be applied from a plain class
|
||||
assert self.raw_kwargs == {
|
||||
"another": 123,
|
||||
}
|
||||
return {}
|
||||
|
||||
TestComponent.render(
|
||||
kwargs={"another": 123},
|
||||
)
|
||||
|
||||
assert did_call_context
|
||||
|
||||
def test_defaults_from_defaults_and_kwargs_namedtuple(self):
|
||||
did_call_context = False
|
||||
|
||||
class TestComponent(Component):
|
||||
template = ""
|
||||
|
||||
class Kwargs(NamedTuple):
|
||||
from_defaults_only: str
|
||||
variable: str = "from_kwargs"
|
||||
from_kwargs_only: str = "kwargs_default"
|
||||
|
||||
class Defaults:
|
||||
variable = "from_defaults"
|
||||
from_defaults_only = "defaults_default"
|
||||
|
||||
def get_template_data(self, args, kwargs, slots, context):
|
||||
nonlocal did_call_context
|
||||
did_call_context = True
|
||||
|
||||
assert self.raw_kwargs == {
|
||||
"variable": "from_kwargs", # Overridden by Kwargs
|
||||
"from_defaults_only": "defaults_default",
|
||||
"from_kwargs_only": "kwargs_default",
|
||||
}
|
||||
return {}
|
||||
|
||||
TestComponent.render(kwargs={})
|
||||
assert did_call_context
|
||||
|
||||
def test_defaults_from_defaults_and_kwargs_dataclass(self):
|
||||
did_call_context = False
|
||||
|
||||
class TestComponent(Component):
|
||||
template = ""
|
||||
|
||||
@dataclass
|
||||
class Kwargs:
|
||||
from_defaults_only: str
|
||||
variable: str = "from_kwargs"
|
||||
from_kwargs_only: str = "kwargs_default"
|
||||
|
||||
class Defaults:
|
||||
variable = "from_defaults"
|
||||
from_defaults_only = "defaults_default"
|
||||
|
||||
def get_template_data(self, args, kwargs, slots, context):
|
||||
nonlocal did_call_context
|
||||
did_call_context = True
|
||||
|
||||
assert self.raw_kwargs == {
|
||||
"variable": "from_kwargs", # Overridden by Kwargs
|
||||
"from_defaults_only": "defaults_default",
|
||||
"from_kwargs_only": "kwargs_default",
|
||||
}
|
||||
return {}
|
||||
|
||||
TestComponent.render(kwargs={})
|
||||
assert did_call_context
|
||||
|
||||
def test_defaults_from_defaults_and_kwargs_other_class(self):
|
||||
did_call_context = False
|
||||
|
||||
class CustomKwargs:
|
||||
def __init__(self, **kwargs):
|
||||
for key, value in kwargs.items():
|
||||
setattr(self, key, value)
|
||||
self._kwargs = kwargs
|
||||
|
||||
def _asdict(self):
|
||||
return self._kwargs
|
||||
|
||||
class TestComponent(Component):
|
||||
template = ""
|
||||
|
||||
class Kwargs(CustomKwargs):
|
||||
variable: str = "from_kwargs"
|
||||
|
||||
class Defaults:
|
||||
variable = "from_defaults"
|
||||
from_defaults_only = "defaults_default"
|
||||
|
||||
def get_template_data(self, args, kwargs, slots, context):
|
||||
nonlocal did_call_context
|
||||
did_call_context = True
|
||||
|
||||
assert self.raw_kwargs == {
|
||||
"variable": "from_defaults", # No override
|
||||
"from_defaults_only": "defaults_default",
|
||||
}
|
||||
return {}
|
||||
|
||||
TestComponent.render(kwargs={})
|
||||
assert did_call_context
|
||||
|
||||
|
||||
@djc_test
|
||||
class TestGetComponentDefaults:
|
||||
def test_defaults_with_factory(self):
|
||||
class MyComponent(Component):
|
||||
template = ""
|
||||
|
||||
class Defaults:
|
||||
val = "static"
|
||||
factory_val = Default(lambda: "from_factory")
|
||||
|
||||
defaults = get_component_defaults(MyComponent)
|
||||
assert defaults == {
|
||||
"val": "static",
|
||||
"factory_val": "from_factory",
|
||||
}
|
||||
|
||||
def test_kwargs_dataclass_with_factory(self):
|
||||
class MyComponent(Component):
|
||||
template = ""
|
||||
|
||||
@dataclass
|
||||
class Kwargs:
|
||||
val: str = "static"
|
||||
factory_val: str = field(default_factory=lambda: "from_factory")
|
||||
|
||||
defaults = get_component_defaults(MyComponent)
|
||||
assert defaults == {
|
||||
"val": "static",
|
||||
"factory_val": "from_factory",
|
||||
}
|
||||
|
||||
def test_defaults_and_kwargs_overrides_with_factories(self):
|
||||
class MyComponent(Component):
|
||||
template = ""
|
||||
|
||||
@dataclass
|
||||
class Kwargs:
|
||||
val_both: str = field(default_factory=lambda: "from_kwargs_factory")
|
||||
val_kwargs: str = field(default_factory=lambda: "kwargs_only")
|
||||
|
||||
class Defaults:
|
||||
val_both = Default(lambda: "from_defaults_factory")
|
||||
val_defaults = Default(lambda: "defaults_only")
|
||||
|
||||
defaults = get_component_defaults(MyComponent)
|
||||
assert defaults == {
|
||||
"val_both": "from_kwargs_factory",
|
||||
"val_kwargs": "kwargs_only",
|
||||
"val_defaults": "defaults_only",
|
||||
}
|
||||
|
||||
def test_kwargs_namedtuple_with_defaults(self):
|
||||
class MyComponent(Component):
|
||||
template = ""
|
||||
|
||||
class Kwargs(NamedTuple):
|
||||
val_no_default: int
|
||||
val_defaults: str
|
||||
val_kwargs: str = "kwargs_default"
|
||||
|
||||
class Defaults:
|
||||
val_defaults = "defaults_default"
|
||||
|
||||
defaults = get_component_defaults(component=MyComponent)
|
||||
assert defaults == {
|
||||
"val_kwargs": "kwargs_default",
|
||||
"val_defaults": "defaults_default",
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue