Skip to content

Commit

Permalink
feat(serializer): add support for FunctionType serialization (#823)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: ManiacDC <ManiacDC​@users.noreply.github.com>
  • Loading branch information
ManiacDC and ManiacDC committed Oct 24, 2023
1 parent 0f15f1d commit f3a454a
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 1 deletion.
12 changes: 12 additions & 0 deletions src/syrupy/extensions/amber/serializer.py
@@ -1,7 +1,9 @@
import collections
import inspect
import os
from collections import OrderedDict
from types import (
FunctionType,
GeneratorType,
MappingProxyType,
)
Expand Down Expand Up @@ -257,6 +259,8 @@ def _serialize(
serialize_method = cls.serialize_namedtuple
elif isinstance(data, (list, tuple, GeneratorType)):
serialize_method = cls.serialize_iterable
elif isinstance(data, FunctionType):
serialize_method = cls.serialize_function
return serialize_method(**serialize_kwargs)

@classmethod
Expand Down Expand Up @@ -337,6 +341,14 @@ def serialize_dict(
**kwargs,
)

@classmethod
def serialize_function(
cls, data: FunctionType, *, depth: int = 0, **kwargs: Any
) -> str:
return cls.__serialize_plain(
data=f"{data.__qualname__}{str(inspect.signature(data))}", depth=depth
)

@classmethod
def serialize_unknown(cls, data: Any, *, depth: int = 0, **kwargs: Any) -> str:
if data.__class__.__repr__ != object.__repr__:
Expand Down
12 changes: 11 additions & 1 deletion src/syrupy/extensions/json/__init__.py
@@ -1,7 +1,11 @@
import datetime
import inspect
import json
from collections import OrderedDict
from types import GeneratorType
from types import (
FunctionType,
GeneratorType,
)
from typing import (
TYPE_CHECKING,
Any,
Expand Down Expand Up @@ -133,6 +137,12 @@ def _filter(
if isinstance(data, (datetime.datetime,)):
return data.strftime("%Y-%m-%dT%H:%M:%S.%f%z")

if isinstance(data, FunctionType):
return (
f"<{FunctionType.__name__} "
f"{data.__qualname__}{str(inspect.signature(data))}>"
)

if data.__class__.__repr__ != object.__repr__:
return repr(data)

Expand Down
Expand Up @@ -217,6 +217,12 @@
# name: test_empty_snapshot.1
''
# ---
# name: test_function_in_file
"function_to_test(var1, var2='test_val', var3: str = 'test_val2', *, kwvar1, kwvar2='some_val') -> str"
# ---
# name: test_function_local
"test_function_local.<locals>.local_function_to_test(var1, var2='test_val', var3: str = 'test_val2', *, kwvar1, kwvar2='some_val') -> int"
# ---
# name: test_list[actual0]
list([
])
Expand Down
19 changes: 19 additions & 0 deletions tests/syrupy/extensions/amber/test_amber_serializer.py
Expand Up @@ -233,3 +233,22 @@ def test_ordered_dict(snapshot):
def test_many_sorted(snapshot):
for i in range(25):
assert i == snapshot


def function_to_test(
var1, var2="test_val", var3: str = "test_val2", *, kwvar1, kwvar2="some_val"
) -> str:
return "2"


def test_function_in_file(snapshot):
assert snapshot == function_to_test


def test_function_local(snapshot):
def local_function_to_test(
var1, var2="test_val", var3: str = "test_val2", *, kwvar1, kwvar2="some_val"
) -> int:
return 1

assert snapshot == local_function_to_test
@@ -0,0 +1 @@
"<function function_to_test(var1, var2='test_val', var3: str = 'test_val2', *, kwvar1, kwvar2='some_val') -> str>"
@@ -0,0 +1 @@
"<function test_function_local.<locals>.local_function_to_test(var1, var2='test_val', var3: str = 'test_val2', *, kwvar1, kwvar2='some_val') -> int>"
19 changes: 19 additions & 0 deletions tests/syrupy/extensions/json/test_json_serializer.py
Expand Up @@ -232,3 +232,22 @@ def test_ordered_dict(snapshot_json):
d["b"] = 0
d["a"] = OrderedDict(b=True, a=False)
assert snapshot_json == d


def function_to_test(
var1, var2="test_val", var3: str = "test_val2", *, kwvar1, kwvar2="some_val"
) -> str:
return "2"


def test_function_in_file(snapshot_json):
assert snapshot_json == function_to_test


def test_function_local(snapshot_json):
def local_function_to_test(
var1, var2="test_val", var3: str = "test_val2", *, kwvar1, kwvar2="some_val"
) -> int:
return 1

assert snapshot_json == local_function_to_test

0 comments on commit f3a454a

Please sign in to comment.