Skip to content

Commit 910343f

Browse files
Fix from_ field alias in token transfer handler (#637)
1 parent 188c452 commit 910343f

File tree

3 files changed

+33
-11
lines changed

3 files changed

+33
-11
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog], and this project adheres to [Semantic Versioning].
66

7+
## [Unreleased]
8+
9+
### Fixed
10+
11+
- config: Fixed incorrest parsing of `token_transfer` index filters.
12+
713
## [6.5.3] - 2022-03-28
814

915
### Fixed

src/dipdup/config.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
from urllib.parse import quote_plus
3838
from urllib.parse import urlparse
3939

40-
from pydantic import Field
4140
from pydantic import validator
4241
from pydantic.dataclasses import dataclass
4342
from pydantic.json import pydantic_encoder
@@ -1155,7 +1154,9 @@ class TokenTransferHandlerConfig(HandlerConfig, kind='handler'):
11551154

11561155
contract: ContractConfig | None = None
11571156
token_id: int | None = None
1158-
from_: ContractConfig | None = Field(default=None, alias='from')
1157+
# FIXME: Can't use `from_` field alias in dataclass; fixed in dipdup.yaml instead
1158+
# FIXME: See https://github.com/pydantic/pydantic/issues/4286
1159+
from_: ContractConfig | None = None
11591160
to: ContractConfig | None = None
11601161

11611162
def iter_imports(self, package: str) -> Iterator[tuple[str, str]]:
@@ -1856,16 +1857,14 @@ def _resolve_index_links(self, index_config: ResolvedIndexConfigU) -> None:
18561857
for token_transfer_handler_config in index_config.handlers:
18571858
token_transfer_handler_config.parent = index_config
18581859

1859-
for attribute_name in ['contract', 'from_', 'to']:
1860-
attribute_value = getattr(token_transfer_handler_config, attribute_name)
1861-
if isinstance(attribute_value, str):
1862-
setattr(
1863-
token_transfer_handler_config,
1864-
attribute_name,
1865-
self.get_contract(attribute_value),
1866-
)
1860+
if isinstance(token_transfer_handler_config.contract, str):
1861+
token_transfer_handler_config.contract = self.get_contract(token_transfer_handler_config.contract)
1862+
1863+
if isinstance(token_transfer_handler_config.from_, str):
1864+
token_transfer_handler_config.from_ = self.get_contract(token_transfer_handler_config.from_)
18671865

1868-
assert token_transfer_handler_config
1866+
if isinstance(token_transfer_handler_config.to, str):
1867+
token_transfer_handler_config.to = self.get_contract(token_transfer_handler_config.to)
18691868

18701869
elif isinstance(index_config, OperationUnfilteredIndexConfig):
18711870
index_config.handler_config.parent = index_config

src/dipdup/yaml.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import json
1717
import logging.config
1818
import re
19+
from copy import copy
1920
from io import StringIO
2021
from os import environ as env
2122
from pathlib import Path
@@ -71,6 +72,18 @@ def substitute_env_variables(config_yaml: str) -> tuple[str, dict[str, str]]:
7172
return config_yaml, environment
7273

7374

75+
def fix_dataclass_field_aliases(config: dict[str, Any]) -> None:
76+
for k, v in copy(config).items():
77+
if 'callack' in config and k == 'from':
78+
config['from_'] = config.pop('from')
79+
elif isinstance(v, dict):
80+
fix_dataclass_field_aliases(v)
81+
elif isinstance(v, list):
82+
for item in v:
83+
if isinstance(item, dict):
84+
fix_dataclass_field_aliases(item)
85+
86+
7487
class DipDupYAMLConfig(dict[str, Any]):
7588
@classmethod
7689
def load(
@@ -92,6 +105,10 @@ def load(
92105

93106
config.update(yaml.load(path_yaml))
94107

108+
# FIXME: Can't use `from_` field alias in dataclass; fixed in dipdup.yaml instead
109+
# FIXME: See https://github.com/pydantic/pydantic/issues/4286
110+
fix_dataclass_field_aliases(config)
111+
95112
return config, config_environment
96113

97114
def dump(self) -> str:

0 commit comments

Comments
 (0)