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

Commit

Permalink
Merge pull request #56 from Protean-Labs/fix/synthetic-field-null-object
Browse files Browse the repository at this point in the history
fix: synthetic field null object
  • Loading branch information
cvauclair committed Nov 1, 2022
2 parents ed2a796 + 8369123 commit 8e55530
Show file tree
Hide file tree
Showing 4 changed files with 145 additions and 82 deletions.
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

0 comments on commit 8e55530

Please sign in to comment.