Skip to content
This repository has been archived by the owner on May 9, 2023. It is now read-only.

fix: synthetic field null object #56

Merged
merged 3 commits into from
Nov 1, 2022
Merged
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
30 changes: 27 additions & 3 deletions subgrounds/transform.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,25 +274,49 @@ def transform_on_type(select: Selection) -> Selection:
def transform_response(self, doc: Document, data: dict[str, Any]) -> dict[str, Any]:
def transform(select: Selection, data: dict) -> None:
match (select, data):
case (Selection(TypeMeta.FieldMeta(name=name), None, _, [] | None) | Selection(TypeMeta.FieldMeta(), name, _, [] | None), dict() as data) if name == self.fmeta.name and name not in data:
case (
Selection(TypeMeta.FieldMeta(name=name), None, _, [] | None) | Selection(TypeMeta.FieldMeta(), name, _, [] | None), dict() as data
) if name == self.fmeta.name and name not in data:
# Case where the selection selects a the syntheticfield of the curren transform
# that is not in the data blob and there are no inner selections

# Try to grab the arguments to the synthetic field transform in the data blob
arg_values = flatten(list(self.args | map(partial(select_data, data=data))))

try:
data[name] = self.f(*arg_values)
except ZeroDivisionError:
except Exception:
data[name] = self.default

case (
Selection(TypeMeta.FieldMeta(name=name), None, _, [] | None) | Selection(TypeMeta.FieldMeta(), name, _, [] | None), dict() as data
) if name not in data:
# Case where the selection selects a regular field but it is not in the data blob (caused by None value at higher selection)
data[name] = None

case (Selection(TypeMeta.FieldMeta(name=name), None, _, [] | None) | Selection(TypeMeta.FieldMeta(), name, _, [] | None), dict() as data):
# Case where the selection selects a regular field and there are no inner selections
# (nothing to do)
pass
case (Selection(TypeMeta.FieldMeta(name=name), None, _, inner_select) | Selection(TypeMeta.FieldMeta(), name, _, inner_select), dict() as data) if name in data:

case (
Selection(TypeMeta.FieldMeta(name=name), None, _, inner_select) | Selection(TypeMeta.FieldMeta(), name, _, inner_select), dict() as data
) if name in data:
match data[name]:
case list() as elts:
for elt in elts:
for select in inner_select:
transform(select, elt)

case dict() as elt:
for select in inner_select:
transform(select, elt)

case None:
data[name] = {}
for select in inner_select:
transform(select, data[name])

case _:
raise Exception(f"transform_response: data for selection {select} is neither list or dict {data[name]}")

Expand Down
20 changes: 20 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,23 @@ def pairs_fieldmeta():
)


@pytest.fixture
def pair_fieldmeta():
return TypeMeta.FieldMeta(
name="pair",
description="",
args=[
TypeMeta.ArgumentMeta(
name="id",
description="",
type=TypeRef.non_null("ID", kind="SCALAR"),
defaultValue=None,
),
],
type=TypeRef.Named(name="Pair", kind="OBJECT"),
)


@pytest.fixture
def swaps_fieldmeta():
return TypeMeta.FieldMeta(
Expand Down Expand Up @@ -87,6 +104,7 @@ def pair_objectmeta():
@pytest.fixture
def schema(
pairs_fieldmeta,
pair_fieldmeta,
swaps_fieldmeta,
swap_objectmeta,
token_objectmeta,
Expand All @@ -96,6 +114,7 @@ def schema(
queryType={"name": 'Query'},
types=[],
type_map={
"ID": TypeMeta.ScalarMeta(name="ID", description=""),
'Int': TypeMeta.ScalarMeta(name='Int', description=''),
'Float': TypeMeta.ScalarMeta(name='Float', description=''),
'BigInt': TypeMeta.ScalarMeta(name='BigInt', description=''),
Expand All @@ -108,6 +127,7 @@ def schema(
'Query': TypeMeta.ObjectMeta(name='Query', description='', fields=[
pairs_fieldmeta,
swaps_fieldmeta,
pair_fieldmeta,
]),
'Swap': swap_objectmeta,
'Swap_filter': TypeMeta.InputObjectMeta(name='Swap_filter', description='', inputFields=[
Expand Down
102 changes: 41 additions & 61 deletions tests/test_subgraph.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ def test_add_synthetic_field_1(subgraph: Subgraph):
sfield = SyntheticField(identity, SyntheticField.FLOAT, subgraph.Pair.reserveUSD)

expected = SchemaMeta(queryType={"name": 'Query'}, types=[], type_map={
"ID": TypeMeta.ScalarMeta(name="ID", description=""),
'Int': TypeMeta.ScalarMeta(name='Int', description='', kind="SCALAR"),
'Float': TypeMeta.ScalarMeta(name='Float', description='', kind="SCALAR"),
'BigInt': TypeMeta.ScalarMeta(name='BigInt', description='', kind="SCALAR"),
Expand All @@ -46,6 +47,15 @@ def test_add_synthetic_field_1(subgraph: Subgraph):
TypeMeta.ArgumentMeta(name='orderDirection', description='', type=TypeRef.Named(name='OrderDirection', kind="ENUM"), defaultValue=None),
], type=TypeRef.non_null_list('Swap', kind="OBJECT")
),
TypeMeta.FieldMeta(name="pair",description="",args=[
TypeMeta.ArgumentMeta(
name="id",
description="",
type=TypeRef.non_null("ID", kind="SCALAR"),
defaultValue=None,
),
], type=TypeRef.Named(name="Pair", kind="OBJECT"),
)
]),
'Swap': TypeMeta.ObjectMeta(name='Swap', description='', fields=[
TypeMeta.FieldMeta(name='id', description='', args=[], type=TypeRef.Named(name='String', kind="SCALAR")),
Expand Down Expand Up @@ -112,6 +122,7 @@ def test_add_synthetic_field_1(subgraph: Subgraph):

def test_add_synthetic_field_2(subgraph: Subgraph):
expected = SchemaMeta(queryType={"name": 'Query'}, types=[], type_map={
"ID": TypeMeta.ScalarMeta(name="ID", description=""),
'Int': TypeMeta.ScalarMeta(name='Int', description='', kind="SCALAR"),
'Float': TypeMeta.ScalarMeta(name='Float', description='', kind="SCALAR"),
'BigInt': TypeMeta.ScalarMeta(name='BigInt', description='', kind="SCALAR"),
Expand All @@ -135,8 +146,17 @@ def test_add_synthetic_field_2(subgraph: Subgraph):
TypeMeta.ArgumentMeta(name='where', description='', type=TypeRef.Named(name='Swap_filter', kind="INPUT_OBJECT"), defaultValue=None),
TypeMeta.ArgumentMeta(name='orderBy', description='', type=TypeRef.Named(name='Swap_orderBy', kind="ENUM"), defaultValue=None),
TypeMeta.ArgumentMeta(name='orderDirection', description='', type=TypeRef.Named(name='OrderDirection', kind="ENUM"), defaultValue=None),
], type=TypeRef.non_null_list('Swap', kind="OBJECT")
], type=TypeRef.non_null_list('Swap', kind="OBJECT"),
),
TypeMeta.FieldMeta(name="pair",description="",args=[
TypeMeta.ArgumentMeta(
name="id",
description="",
type=TypeRef.non_null("ID", kind="SCALAR"),
defaultValue=None,
),
], type=TypeRef.Named(name="Pair", kind="OBJECT"),
)
]),
'Swap': TypeMeta.ObjectMeta(name='Swap', description='', fields=[
TypeMeta.FieldMeta(name='id', description='', args=[], type=TypeRef.Named(name='String', kind="SCALAR")),
Expand Down Expand Up @@ -203,6 +223,7 @@ def test_add_synthetic_field_2(subgraph: Subgraph):

def test_add_synthetic_field_3(subgraph: Subgraph):
expected = SchemaMeta(queryType={"name": 'Query'}, types=[], type_map={
"ID": TypeMeta.ScalarMeta(name="ID", description=""),
'Int': TypeMeta.ScalarMeta(name='Int', description='', kind="SCALAR"),
'Float': TypeMeta.ScalarMeta(name='Float', description='', kind="SCALAR"),
'BigInt': TypeMeta.ScalarMeta(name='BigInt', description='', kind="SCALAR"),
Expand All @@ -228,6 +249,15 @@ def test_add_synthetic_field_3(subgraph: Subgraph):
TypeMeta.ArgumentMeta(name='orderDirection', description='', type=TypeRef.Named(name='OrderDirection', kind="ENUM"), defaultValue=None),
], type=TypeRef.non_null_list('Swap', kind="OBJECT")
),
TypeMeta.FieldMeta(name="pair",description="",args=[
TypeMeta.ArgumentMeta(
name="id",
description="",
type=TypeRef.non_null("ID", kind="SCALAR"),
defaultValue=None,
),
], type=TypeRef.Named(name="Pair", kind="OBJECT"),
)
]),
'Swap': TypeMeta.ObjectMeta(name='Swap', description='', fields=[
TypeMeta.FieldMeta(name='id', description='', args=[], type=TypeRef.Named(name='String', kind="SCALAR")),
Expand Down Expand Up @@ -296,6 +326,7 @@ def test_add_synthetic_field_3(subgraph: Subgraph):

def test_add_synthetic_field_4(subgraph: Subgraph):
expected = SchemaMeta(queryType={"name": 'Query'}, types=[], type_map={
"ID": TypeMeta.ScalarMeta(name="ID", description=""),
'Int': TypeMeta.ScalarMeta(name='Int', description='', kind="SCALAR"),
'Float': TypeMeta.ScalarMeta(name='Float', description='', kind="SCALAR"),
'BigInt': TypeMeta.ScalarMeta(name='BigInt', description='', kind="SCALAR"),
Expand All @@ -321,6 +352,15 @@ def test_add_synthetic_field_4(subgraph: Subgraph):
TypeMeta.ArgumentMeta(name='orderDirection', description='', type=TypeRef.Named(name='OrderDirection', kind="ENUM"), defaultValue=None),
], type=TypeRef.non_null_list('Swap', kind="OBJECT")
),
TypeMeta.FieldMeta(name="pair",description="",args=[
TypeMeta.ArgumentMeta(
name="id",
description="",
type=TypeRef.non_null("ID", kind="SCALAR"),
defaultValue=None,
),
], type=TypeRef.Named(name="Pair", kind="OBJECT"),
)
]),
'Swap': TypeMeta.ObjectMeta(name='Swap', description='', fields=[
TypeMeta.FieldMeta(name='id', description='', args=[], type=TypeRef.Named(name='String', kind="SCALAR")),
Expand Down Expand Up @@ -408,14 +448,6 @@ def test_object(subgraph: Subgraph):
def test_field_path_1(subgraph: Subgraph):
expected = FieldPath(
subgraph,
# TypeMeta.ObjectMeta(name='Pair', description='', fields=[
# TypeMeta.FieldMeta(name='id', description="", args=[], type=TypeRef.Named(name="String", kind="SCALAR")),
# TypeMeta.FieldMeta(name='token0', description="", args=[], type=TypeRef.Named(name="Token", kind="OBJECT")),
# TypeMeta.FieldMeta(name='token1', description="", args=[], type=TypeRef.Named(name="Token", kind="OBJECT")),
# TypeMeta.FieldMeta(name='reserveUSD', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# TypeMeta.FieldMeta(name='priceToken0', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# TypeMeta.FieldMeta(name='priceToken1', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# ]),
TypeRef.Named(name="Pair", kind="OBJECT"),
TypeRef.Named(name="Token", kind="OBJECT"),
[
Expand All @@ -432,14 +464,6 @@ def test_field_path_1(subgraph: Subgraph):
def test_field_path_2(subgraph: Subgraph):
expected = FieldPath(
subgraph,
# TypeMeta.ObjectMeta('Pair', '', fields=[
# TypeMeta.FieldMeta('id', description="", args=[], type=TypeRef.Named(name="String", kind="SCALAR")),
# TypeMeta.FieldMeta('token0', description="", args=[], type=TypeRef.Named(name="Token", kind="OBJECT")),
# TypeMeta.FieldMeta('token1', description="", args=[], type=TypeRef.Named(name="Token", kind="OBJECT")),
# TypeMeta.FieldMeta('reserveUSD', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# TypeMeta.FieldMeta('priceToken0', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# TypeMeta.FieldMeta('priceToken1', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# ]),
TypeRef.Named(name="Pair", kind="OBJECT"),
TypeRef.Named(name="String", kind="SCALAR"),
[
Expand All @@ -456,14 +480,6 @@ def test_field_path_2(subgraph: Subgraph):
def test_field_path_3(subgraph: Subgraph):
expected = FieldPath(
subgraph,
# TypeMeta.ObjectMeta('Pair', '', fields=[
# TypeMeta.FieldMeta('id', description="", args=[], type=TypeRef.Named(name="String", kind="SCALAR")),
# TypeMeta.FieldMeta('token0', description="", args=[], type=TypeRef.Named(name="Token", kind="OBJECT")),
# TypeMeta.FieldMeta('token1', description="", args=[], type=TypeRef.Named(name="Token", kind="OBJECT")),
# TypeMeta.FieldMeta('reserveUSD', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# TypeMeta.FieldMeta('priceToken0', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# TypeMeta.FieldMeta('priceToken1', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# ]),
TypeRef.Named(name="Pair", kind="OBJECT"),
TypeRef.Named(name="String", kind="SCALAR"),
[
Expand All @@ -483,14 +499,6 @@ def test_synthetic_field_path_1(subgraph: Subgraph):

expected = FieldPath(
subgraph,
# TypeMeta.ObjectMeta(name='Pair', description='', fields=[
# TypeMeta.FieldMeta(name='id', description="", args=[], type=TypeRef.Named(name="String", kind="SCALAR")),
# TypeMeta.FieldMeta(name='token0', description="", args=[], type=TypeRef.Named(name="Token", kind="OBJECT")),
# TypeMeta.FieldMeta(name='token1', description="", args=[], type=TypeRef.Named(name="Token", kind="OBJECT")),
# TypeMeta.FieldMeta(name='reserveUSD', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# TypeMeta.FieldMeta(name='priceToken0', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# TypeMeta.FieldMeta(name='priceToken1', description="", args=[], type=TypeRef.Named(name="BigDecimal", kind="SCALAR")),
# ]),
TypeRef.Named(name="Pair", kind="OBJECT"),
TypeRef.Named(name="Float", kind="SCALAR"),
[
Expand All @@ -510,12 +518,6 @@ def test_synthetic_field_path_2(subgraph: Subgraph):

expected = FieldPath(
subgraph,
# TypeMeta.ObjectMeta('Token', '', fields=[
# TypeMeta.FieldMeta('id', description="", args=[], type=TypeRef.Named(name="String", kind="SCALAR")),
# TypeMeta.FieldMeta('name', description="", args=[], type=TypeRef.Named(name="String", kind="SCALAR")),
# TypeMeta.FieldMeta('symbol', description="", args=[], type=TypeRef.Named(name="String", kind="SCALAR")),
# TypeMeta.FieldMeta('decimals', description="", args=[], type=TypeRef.Named(name="Int", kind="SCALAR")),
# ]),
TypeRef.Named(name="Token", kind="OBJECT"),
TypeRef.Named(name="String", kind="SCALAR"),
[
Expand Down Expand Up @@ -639,15 +641,6 @@ def test_field_path_args_2(subgraph: Subgraph):
def test_field_path_args_3(subgraph: Subgraph):
expected = FieldPath(
subgraph,
# TypeMeta.ObjectMeta(name='Query', description='', fields=[
# TypeMeta.FieldMeta(name='pairs', description='', args=[
# TypeMeta.ArgumentMeta(name='first', description='', type=TypeRef.Named(name="Int", kind="SCALAR"), defaultValue=None),
# TypeMeta.ArgumentMeta(name='where', description='', type=TypeRef.Named(name="Pair_filter", kind="INPUT_OBJECT"), defaultValue=None),
# TypeMeta.ArgumentMeta(name='orderBy', description='', type=TypeRef.Named(name="Pair_orderBy", kind="ENUM"), defaultValue=None),
# TypeMeta.ArgumentMeta(name='orderDirection', description='', type=TypeRef.Named(name="OrderDirection", kind="ENUM"), defaultValue=None),
# ], type=TypeRef.non_null_list("Pair", kind="OBJECT")),
# TypeMeta.FieldMeta('swaps', description="", args=[], type=TypeRef.non_null_list("Swap", kind="OBJECT")),
# ]),
TypeRef.Named(name='Query', kind="OBJECT"),
TypeRef.non_null_list('Pair', kind="OBJECT"),
[
Expand All @@ -656,10 +649,6 @@ def test_field_path_args_3(subgraph: Subgraph):
'first': 100,
'orderBy': 'reserveUSD'
},
# [
# Argument('first', InputValue.Int(100)),
# Argument('orderBy', InputValue.Enum('reserveUSD'))
# ],
TypeMeta.FieldMeta(name='pairs', description='', args=[
TypeMeta.ArgumentMeta(name='first', description='', type=TypeRef.Named(name="Int", kind="SCALAR"), defaultValue=None),
TypeMeta.ArgumentMeta(name='skip', description='', type=TypeRef.Named(name="Int", kind="SCALAR"), defaultValue=None),
Expand All @@ -683,15 +672,6 @@ def test_field_path_args_3(subgraph: Subgraph):
def test_field_path_extend_1(subgraph: Subgraph):
expected = FieldPath(
subgraph,
# TypeMeta.ObjectMeta('Query', '', fields=[
# TypeMeta.FieldMeta('pairs', '', [
# TypeMeta.ArgumentMeta('first', '', TypeRef.Named(name="Int", kind="SCALAR"), None),
# TypeMeta.ArgumentMeta('where', '', TypeRef.Named(name="Pair_filter", kind="INPUT_OBJECT"), None),
# TypeMeta.ArgumentMeta('orderBy', '', TypeRef.Named(name="Pair_orderBy", kind="ENUM"), None),
# TypeMeta.ArgumentMeta('orderDirection', '', TypeRef.Named(name="OrderDirection", kind="ENUM"), None),
# ], TypeRef.non_null_list("Pair", kind="OBJECT")),
# TypeMeta.FieldMeta('swaps', description="", args=[], type=TypeRef.non_null_list("Swap", kind="OBJECT")),
# ]),
TypeRef.Named(name="Query", kind="OBJECT"),
TypeRef.Named(name="String", kind="SCALAR"),
[
Expand Down
Loading