Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion elasticsearch/dsl/field.py
Original file line number Diff line number Diff line change
Expand Up @@ -571,7 +571,8 @@ def _serialize(
# somebody assigned raw dict to the field, we should tolerate that
if isinstance(data, collections.abc.Mapping):
return data

if isinstance(data, AttrDict):
return data.to_dict()
return data.to_dict(skip_empty=skip_empty)

def clean(self, data: Any) -> Any:
Expand Down
7 changes: 7 additions & 0 deletions test_elasticsearch/test_dsl/test_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from dateutil import tz

from elasticsearch.dsl import InnerDoc, Range, ValidationException, field
from elasticsearch.dsl.utils import AttrDict


def test_date_range_deserialization() -> None:
Expand Down Expand Up @@ -232,3 +233,9 @@ class Inner(InnerDoc):

with pytest.raises(ValidationException):
field.Object(doc_class=Inner, dynamic=False)


def test_object_with_attrdict() -> None:
f = field.Object(dynamic=True)
assert f.deserialize(AttrDict({"a": "b"})).to_dict() == {"a": "b"}
assert f.serialize(AttrDict({"a": "b"})) == {"a": "b"}
13 changes: 7 additions & 6 deletions utils/templates/field.py.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,8 @@ class {{ k.name }}({{ k.parent }}):
# somebody assigned raw dict to the field, we should tolerate that
if isinstance(data, collections.abc.Mapping):
return data

if isinstance(data, AttrDict):
return data.to_dict()
return data.to_dict(skip_empty=skip_empty)

def clean(self, data: Any) -> Any:
Expand Down Expand Up @@ -388,7 +389,7 @@ class {{ k.name }}({{ k.parent }}):
# Divide by a float to preserve milliseconds on the datetime.
return datetime.utcfromtimestamp(data / 1000.0)

raise ValidationException(f"Could not parse date from the value ({data!r})")
raise ValidationException(f"Could not parse date from the value ({data!r})")
{% elif k.field == "boolean" %}
super().__init__(*args, **kwargs)

Expand All @@ -402,7 +403,7 @@ class {{ k.name }}({{ k.parent }}):
data = self.deserialize(data)
if data is None and self._required:
raise ValidationException("Value required for this field.")
return data # type: ignore[no-any-return]
return data # type: ignore[no-any-return]
{% elif k.field == "float" %}
super().__init__(*args, **kwargs)

Expand Down Expand Up @@ -432,7 +433,7 @@ class {{ k.name }}({{ k.parent }}):
super().__init__(*args, **kwargs)

def _deserialize(self, data: Any) -> int:
return int(data)
return int(data)
{% elif k.field == "ip" %}
super().__init__(*args, **kwargs)

Expand All @@ -443,7 +444,7 @@ class {{ k.name }}({{ k.parent }}):
def _serialize(self, data: Any, skip_empty: bool) -> Optional[str]:
if data is None:
return None
return str(data)
return str(data)
{% elif k.field == "binary" %}
super().__init__(*args, **kwargs)

Expand All @@ -458,7 +459,7 @@ class {{ k.name }}({{ k.parent }}):
def _serialize(self, data: Any, skip_empty: bool) -> Optional[str]:
if data is None:
return None
return base64.b64encode(data).decode()
return base64.b64encode(data).decode()
{% elif k.field == "percolator" %}
super().__init__(*args, **kwargs)

Expand Down