Skip to content
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
81 changes: 44 additions & 37 deletions src/dipdup/codegen/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,32 +75,6 @@ async def init(
no_base: bool = False,
) -> None: ...

async def generate_hooks(self) -> None:
for hook_config in self._config.hooks.values():
await self._generate_callback(hook_config, 'hooks', sql=True)

async def generate_system_hooks(self) -> None:
for hook_config in SYSTEM_HOOKS.values():
await self._generate_callback(hook_config, 'hooks', sql=True)

async def generate_handlers(self) -> None:
for index_config in self._config.indexes.values():
if isinstance(index_config, IndexTemplateConfig):
continue

for handler_config in index_config.handlers:
await self._generate_callback(handler_config, 'handlers')

async def generate_batch_handler(self) -> None:
await self._generate_callback(
callback_config=BatchHandlerConfig(),
kind='handlers',
code=(
'for handler in handlers:',
' await ctx.fire_matched_handler(handler)',
),
)

async def _generate_callback(
self,
callback_config: CallbackMixin,
Expand Down Expand Up @@ -167,18 +141,10 @@ async def _generate_callback(
)
touch(sql_path)

async def _generate_models(self) -> None:
for path in self._package.models.glob('**/*.py'):
if path.stat().st_size == 0:
continue
return

path = self._package.models / PACKAGE_MARKER
content_path = Path(__file__).parent.parent / 'templates' / 'models.py'
write(path, content_path.read_text())


class CodeGenerator(_BaseCodeGenerator, ABC):
"""Base class for blockchain-specific code generators."""

kind: str

@property
Expand All @@ -200,8 +166,13 @@ async def init(
no_linter: bool = False,
no_base: bool = False,
) -> None:
_logger.info('%s: generating ABIs', self.kind)
await self.generate_abis()

_logger.info('%s: generating JSONSchemas', self.kind)
await self.generate_schemas()

_logger.info('%s: generating types', self.kind)
await self._generate_types(force)

async def _generate_types(self, force: bool = False) -> None:
Expand Down Expand Up @@ -274,7 +245,7 @@ async def init(
include=self._include,
)

await self._generate_models()
await self.generate_models()

await self.generate_hooks()
await self.generate_system_hooks()
Expand All @@ -283,6 +254,42 @@ async def init(
await self.generate_handlers()
await self.generate_batch_handler()

async def generate_models(self) -> None:
for path in self._package.models.glob('**/*.py'):
if path.stat().st_size == 0:
continue
return

path = self._package.models / PACKAGE_MARKER
content_path = Path(__file__).parent.parent / 'templates' / 'models.py'
write(path, content_path.read_text())

async def generate_hooks(self) -> None:
for hook_config in self._config.hooks.values():
await self._generate_callback(hook_config, 'hooks', sql=True)

async def generate_system_hooks(self) -> None:
for hook_config in SYSTEM_HOOKS.values():
await self._generate_callback(hook_config, 'hooks', sql=True)

async def generate_handlers(self) -> None:
for index_config in self._config.indexes.values():
if isinstance(index_config, IndexTemplateConfig):
continue

for handler_config in index_config.handlers:
await self._generate_callback(handler_config, 'handlers')

async def generate_batch_handler(self) -> None:
await self._generate_callback(
callback_config=BatchHandlerConfig(),
kind='handlers',
code=(
'for handler in handlers:',
' await ctx.fire_matched_handler(handler)',
),
)


async def generate_environments(
config: DipDupConfig,
Expand Down
9 changes: 0 additions & 9 deletions src/dipdup/codegen/evm.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,6 @@ async def generate_schemas(self) -> None:

abi_to_jsonschemas(self._package, events, methods)

async def generate_hooks(self) -> None:
pass

async def generate_system_hooks(self) -> None:
pass

async def generate_handlers(self) -> None:
pass

async def _fetch_abi(self, index_config: EvmIndexConfigU) -> None:
contracts_from_event_handlers: list[EvmContractConfig] = [
handler_config.contract
Expand Down
9 changes: 0 additions & 9 deletions src/dipdup/codegen/starknet.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,6 @@ async def generate_schemas(self) -> None:

abi_to_jsonschemas(self._package, events)

async def generate_hooks(self) -> None:
pass

async def generate_system_hooks(self) -> None:
pass

async def generate_handlers(self) -> None:
pass

def get_typeclass_name(self, schema_path: Path) -> str:
module_name = schema_path.stem
if schema_path.parent.name == 'starknet_events':
Expand Down
13 changes: 2 additions & 11 deletions src/dipdup/codegen/substrate.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def scale_type_to_jsonschema(
},
}

# Handle primitives, default to str
# NOTE: Handle primitives, default to str
schema: dict[str, Any] = {
'description': type_string,
'type': 'string',
Expand Down Expand Up @@ -197,7 +197,7 @@ async def generate_schemas(self) -> None:
target_events[runtime_name].remove(qualname)

# FIXME: ignore when only docs changed?
dump = orjson.dumps({**event_item, 'name': ''})
dump = orjson.dumps(event_item)
if dump == latest_dumps[qualname]:
continue
latest_dumps[qualname] = dump
Expand Down Expand Up @@ -260,15 +260,6 @@ async def _generate_types(self, force: bool = False) -> None:

write(typeclass_dir.joinpath('__init__.py'), '\n'.join(root_lines), overwrite=True)

async def generate_hooks(self) -> None:
pass

async def generate_system_hooks(self) -> None:
pass

async def generate_handlers(self) -> None:
pass

def get_typeclass_name(self, schema_path: Path) -> str:
module_name = schema_path.stem
if schema_path.parent.name == 'substrate_events':
Expand Down
33 changes: 24 additions & 9 deletions src/dipdup/dipdup.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,12 @@
from dipdup.config import PostgresDatabaseConfig
from dipdup.config import SqliteDatabaseConfig
from dipdup.config.evm import EvmContractConfig
from dipdup.config.evm import EvmIndexConfig
from dipdup.config.starknet import StarknetContractConfig
from dipdup.config.starknet import StarknetIndexConfig
from dipdup.config.substrate import SubstrateIndexConfig
from dipdup.config.tezos import TezosContractConfig
from dipdup.config.tezos import TezosIndexConfig
from dipdup.context import DipDupContext
from dipdup.context import MetadataCursor
from dipdup.database import generate_schema
Expand Down Expand Up @@ -674,15 +678,26 @@ async def init(
package = DipDupPackage(self._config.package_path)
package.load_abis()

codegen_classes: tuple[type[CodeGenerator], ...] = ( # type: ignore[assignment]
CommonCodeGenerator,
EvmCodeGenerator,
StarknetCodeGenerator,
SubstrateCodeGenerator,
TezosCodeGenerator,
)
for codegen_cls in codegen_classes:
codegen = codegen_cls(
codegen_classes: set[type[CodeGenerator]] = set()

for index_config in self._config.indexes.values():
if isinstance(index_config, IndexTemplateConfig):
index_config = self._config.templates[index_config.template]

if isinstance(index_config, TezosIndexConfig):
codegen_classes.add(TezosCodeGenerator)
elif isinstance(index_config, EvmIndexConfig):
codegen_classes.add(EvmCodeGenerator)
elif isinstance(index_config, StarknetIndexConfig):
codegen_classes.add(StarknetCodeGenerator)
elif isinstance(index_config, SubstrateIndexConfig):
codegen_classes.add(SubstrateCodeGenerator)
else:
msg = f'Unsupported index config: {index_config}'
raise FrameworkException(msg)

for codegen_cls in (CommonCodeGenerator, *tuple(codegen_classes)):
codegen = codegen_cls( # type: ignore[operator]
config=self._config,
package=package,
datasources=self._datasources,
Expand Down