Skip to content

Commit 337886a

Browse files
Fix TzktDatasource getters, add missing typehints (#274)
1 parent ce66d21 commit 337886a

File tree

23 files changed

+210
-195
lines changed

23 files changed

+210
-195
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## [unreleased]
4+
5+
### Fixed
6+
7+
* tzkt: Fixed `get_originated_contracts` and `get_similar_contracts` methods response.
8+
39
## 5.0.0-rc3 - 2022-03-28
410

511
### Added

poetry.lock

Lines changed: 59 additions & 58 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/extract_reference.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@
1818
line = line.strip()
1919
if line.startswith(':param'):
2020
parts = line.split(':')
21-
param, desc = parts[1], parts[2].strip()
21+
param, desc = parts[1], ':'.join(parts[2:]).strip()
2222
print(f'| `{param[6:]}` | {desc} |')

src/dipdup/config.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def connection_string(self) -> str:
119119
return connection_string
120120

121121
@validator('immune_tables')
122-
def _valid_immune_tables(cls, v):
122+
def _valid_immune_tables(cls, v) -> None:
123123
for table in v:
124124
if table.startswith('dipdup'):
125125
raise ConfigurationError('Tables with `dipdup` prefix can\'t be immune')
@@ -184,15 +184,15 @@ class ContractConfig(NameMixin):
184184
address: str
185185
typename: Optional[str] = None
186186

187-
def __hash__(self):
187+
def __hash__(self) -> int:
188188
return hash(f'{self.address}{self.typename or ""}')
189189

190190
@cached_property
191191
def module_name(self) -> str:
192192
return self.typename or self.name
193193

194194
@validator('address', allow_reuse=True)
195-
def _valid_address(cls, v):
195+
def _valid_address(cls, v: str) -> str:
196196
# NOTE: Environment substitution was disabled during export, skip validation
197197
if '$' in v:
198198
return v
@@ -217,7 +217,7 @@ class TzktDatasourceConfig(NameMixin):
217217
url: str
218218
http: Optional[HTTPConfig] = None
219219

220-
def __hash__(self):
220+
def __hash__(self) -> int:
221221
return hash(self.kind + self.url)
222222

223223
def __post_init_post_parse__(self) -> None:
@@ -249,7 +249,7 @@ class CoinbaseDatasourceConfig(NameMixin):
249249
passphrase: Optional[str] = None
250250
http: Optional[HTTPConfig] = None
251251

252-
def __hash__(self):
252+
def __hash__(self) -> int:
253253
return hash(self.kind)
254254

255255

@@ -268,7 +268,7 @@ class MetadataDatasourceConfig(NameMixin):
268268
url: str = DEFAULT_METADATA_URL
269269
http: Optional[HTTPConfig] = None
270270

271-
def __hash__(self):
271+
def __hash__(self) -> int:
272272
return hash(self.kind + self.url + self.network.value)
273273

274274

@@ -285,7 +285,7 @@ class IpfsDatasourceConfig(NameMixin):
285285
url: str = DEFAULT_IPFS_URL
286286
http: Optional[HTTPConfig] = None
287287

288-
def __hash__(self):
288+
def __hash__(self) -> int:
289289
return hash(self.kind + self.url)
290290

291291

@@ -302,7 +302,7 @@ class HttpDatasourceConfig(NameMixin):
302302
url: str
303303
http: Optional[HTTPConfig] = None
304304

305-
def __hash__(self):
305+
def __hash__(self) -> int:
306306
return hash(self.kind + self.url)
307307

308308

@@ -344,7 +344,7 @@ def format_arguments(self) -> Iterator[str]:
344344

345345
def locate_arguments(self) -> Dict[str, Optional[Type]]:
346346
"""Try to resolve scope annotations for arguments"""
347-
kwargs: Dict[str, Optional[Type]] = {}
347+
kwargs: Dict[str, Optional[Type[Any]]] = {}
348348
for name, cls in self.iter_arguments():
349349
cls = cls.split(' as ')[0]
350350
kwargs[name] = cast(Optional[Type], locate(cls))
@@ -394,11 +394,11 @@ def format_untyped_operation_argument(cls, transaction_idx: int, optional: bool)
394394
class StorageTypeMixin:
395395
"""`storage_type_cls` field"""
396396

397-
def __post_init_post_parse__(self):
398-
self._storage_type_cls = None
397+
def __post_init_post_parse__(self) -> None:
398+
self._storage_type_cls: Optional[Type[Any]] = None
399399

400400
@cached_property
401-
def storage_type_cls(self) -> Type:
401+
def storage_type_cls(self) -> Type[Any]:
402402
if self._storage_type_cls is None:
403403
raise ConfigInitializationException
404404
return self._storage_type_cls
@@ -429,7 +429,7 @@ def parent(self) -> Optional[T]:
429429
class ParameterTypeMixin:
430430
"""`parameter_type_cls` field"""
431431

432-
def __post_init_post_parse__(self):
432+
def __post_init_post_parse__(self) -> None:
433433
self._parameter_type_cls = None
434434

435435
@cached_property
@@ -809,8 +809,8 @@ class BigMapHandlerConfig(HandlerConfig, kind='handler'):
809809

810810
def __post_init_post_parse__(self):
811811
super().__post_init_post_parse__()
812-
self._key_type_cls = None
813-
self._value_type_cls = None
812+
self._key_type_cls: Optional[Type[Any]] = None
813+
self._value_type_cls: Optional[Type[Any]] = None
814814

815815
@classmethod
816816
def format_key_import(cls, package: str, module_name: str, path: str) -> Tuple[str, str]:

src/dipdup/context.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ def token(cls) -> int:
9696

9797
# TODO: Dataclasses are cool, everyone loves them. Resolve issue with pydantic serialization.
9898
class DipDupContext:
99+
"""Class to store application context
100+
101+
:param datasources: Mapping of available datasources
102+
:param config: DipDup configuration
103+
:param callbacks: Low-level callback interface (intented for internal use)
104+
:param logger: Context-aware logger instance
105+
"""
106+
99107
def __init__(
100108
self,
101109
datasources: Dict[str, Datasource],
@@ -118,6 +126,12 @@ async def fire_hook(
118126
*args,
119127
**kwargs: Any,
120128
) -> None:
129+
"""Fire hook with given name and arguments.
130+
131+
:param name: Hook name
132+
:param fmt: Format string for `ctx.logger` messages
133+
:param wait: Wait for hook to finish or fire and forget
134+
"""
121135
await self.callbacks.fire_hook(self, name, fmt, wait, *args, **kwargs)
122136

123137
async def fire_handler(
@@ -129,20 +143,28 @@ async def fire_handler(
129143
*args,
130144
**kwargs: Any,
131145
) -> None:
146+
"""Fire handler with given name and arguments.
147+
148+
:param name: Handler name
149+
:param index: Index name
150+
:param datasource: An instance of datasource that triggered the handler
151+
:param fmt: Format string for `ctx.logger` messages
152+
"""
132153
await self.callbacks.fire_handler(self, name, index, datasource, fmt, *args, **kwargs)
133154

134155
async def execute_sql(self, name: str) -> None:
156+
"""Execute SQL script with given name
157+
158+
:param name: SQL script name within `<project>/sql` directory
159+
"""
135160
await self.callbacks.execute_sql(self, name)
136161

137162
async def restart(self) -> None:
138-
"""Restart preserving CLI arguments"""
139-
# NOTE: Remove --reindex from arguments to avoid reindexing loop
140-
if '--reindex' in sys.argv:
141-
sys.argv.remove('--reindex')
163+
"""Restart indexer preserving CLI arguments"""
142164
os.execl(sys.executable, sys.executable, *sys.argv)
143165

144166
async def reindex(self, reason: Optional[Union[str, ReindexingReason]] = None, **context) -> None:
145-
"""Drop all tables or whole database and restart with the same CLI arguments"""
167+
"""Drop the whole database and restart with the same CLI arguments"""
146168
if not reason:
147169
reason = ReindexingReason.manual
148170
elif isinstance(reason, str):

src/dipdup/datasources/subscription.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import logging
22
from abc import ABC
33
from typing import Dict
4+
from typing import Optional
45
from typing import Set
56

67
from pydantic.dataclasses import dataclass
7-
from tortoise import Optional
88

99
_logger = logging.getLogger('dipdup.datasource')
1010

src/dipdup/datasources/tzkt/datasource.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,12 @@ async def get_similar_contracts(
305305
'get',
306306
url=f'v1/contracts/{address}/{entrypoint}',
307307
params={
308-
'select': 'address',
308+
'select': 'id,address',
309309
'offset': offset,
310310
'limit': limit,
311311
},
312312
)
313-
return tuple(response)
313+
return tuple(item['address'] for item in response)
314314

315315
async def iter_similar_contracts(
316316
self,
@@ -333,12 +333,12 @@ async def get_originated_contracts(
333333
'get',
334334
url=f'v1/accounts/{address}/contracts',
335335
params={
336-
'select': 'address',
336+
'select': 'id,address',
337337
'offset': offset,
338338
'limit': limit,
339339
},
340340
)
341-
return tuple(response)
341+
return tuple(item['address'] for item in response)
342342

343343
async def iter_originated_contracts(self, address: str) -> AsyncIterator[Tuple[str, ...]]:
344344
async for batch in self._iter_batches(self.get_originated_contracts, address, cursor=False):

src/dipdup/exceptions.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def indent(text: str, indent: int = 2) -> str:
2828
class DipDupException(Exception):
2929
message: str
3030

31-
def __init__(self, *args) -> None:
31+
def __init__(self, *args: Any) -> None:
3232
super().__init__(self.message, *args)
3333

3434

@@ -250,7 +250,7 @@ def _help(self) -> str:
250250
class InvalidDataError(DipDupError):
251251
"""Failed to validate datasource message against generated type class"""
252252

253-
type_cls: Type
253+
type_cls: Type[Any]
254254
data: Any
255255
parsed_object: Any
256256

@@ -291,8 +291,8 @@ class CallbackTypeError(DipDupError):
291291
name: str
292292

293293
arg: str
294-
type_: Type
295-
expected_type: Type
294+
type_: Type[Any]
295+
expected_type: Type[Any]
296296

297297
def _help(self) -> str:
298298
return f"""

src/dipdup/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
from dipdup.enums import IndexStatus
1818
from dipdup.enums import IndexType
19-
from dipdup.exceptions import ReindexingReason
19+
from dipdup.enums import ReindexingReason
2020

2121
ParameterType = TypeVar('ParameterType', bound=BaseModel)
2222
StorageType = TypeVar('StorageType', bound=BaseModel)

src/dipdup/prometheus.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import time
22
from contextlib import contextmanager
3+
from typing import Generator
34

45
from prometheus_client import Counter # type: ignore
56
from prometheus_client import Gauge
@@ -74,31 +75,31 @@ def __new__(cls):
7475

7576
@classmethod
7677
@contextmanager
77-
def measure_level_sync_duration(cls):
78+
def measure_level_sync_duration(cls) -> Generator[None, None, None]:
7879
with _index_level_sync_duration.time():
7980
yield
8081

8182
@classmethod
8283
@contextmanager
83-
def measure_level_realtime_duration(cls):
84+
def measure_level_realtime_duration(cls) -> Generator[None, None, None]:
8485
with _index_level_realtime_duration.time():
8586
yield
8687

8788
@classmethod
8889
@contextmanager
89-
def measure_total_sync_duration(cls):
90+
def measure_total_sync_duration(cls) -> Generator[None, None, None]:
9091
with _index_total_sync_duration.time():
9192
yield
9293

9394
@classmethod
9495
@contextmanager
95-
def measure_total_realtime_duration(cls):
96+
def measure_total_realtime_duration(cls) -> Generator[None, None, None]:
9697
with _index_total_realtime_duration.time():
9798
yield
9899

99100
@classmethod
100101
@contextmanager
101-
def measure_callback_duration(cls, name: str):
102+
def measure_callback_duration(cls, name: str) -> Generator[None, None, None]:
102103
with _callback_duration.labels(callback=name).time():
103104
yield
104105

@@ -109,11 +110,11 @@ def set_indexes_count(cls, active: int, synced: int, realtime: int) -> None:
109110
_indexes_total.labels(status='realtime').set(realtime)
110111

111112
@classmethod
112-
def set_datasource_head_updated(cls, name: str):
113+
def set_datasource_head_updated(cls, name: str) -> None:
113114
_datasource_head_updated.labels(datasource=name).observe(time.time())
114115

115116
@classmethod
116-
def set_datasource_rollback(cls, name: str):
117+
def set_datasource_rollback(cls, name: str) -> None:
117118
_datasource_rollbacks.labels(datasource=name).inc()
118119

119120
@classmethod
@@ -125,9 +126,9 @@ def set_index_handlers_matched(cls, amount: float) -> None:
125126
_index_handlers_matched.inc(amount)
126127

127128
@classmethod
128-
def set_levels_to_sync(cls, index: str, levels: int):
129+
def set_levels_to_sync(cls, index: str, levels: int) -> None:
129130
_index_levels_to_sync.labels(index=index).observe(levels)
130131

131132
@classmethod
132-
def set_levels_to_realtime(cls, index: str, levels: int):
133+
def set_levels_to_realtime(cls, index: str, levels: int) -> None:
133134
_index_levels_to_realtime.labels(index=index).observe(levels)

0 commit comments

Comments
 (0)