[project] name = "dipdup" description = "Modular framework for creating selective indexers and featureful backends for dapps" version = "8.5.1" license = { text = "MIT" } authors = [ { name = "Lev Gorodetskii", email = "github@drsr.io" }, { name = "Vladimir Bobrikov", email = "vladimir_bobrikov@pm.me" }, { name = "Michael Zaikin", email = "mz@baking-bad.org" }, { name = "Igor Sereda", email = "sereda.igor.s@gmail.com" }, ] maintainers = [ { name = "Baking Bad team", email = "hello@baking-bad.org" }, ] readme = "README.md" requires-python = ">=3.12,<3.13" keywords = [ "api", "backend", "blockchain", "crypto", "cryptocurrencies", "dapp", "ethereum", "evm", "framework", "indexer", "indexers", "starknet", "sdk", "smart-contracts", "tezos", "web3", ] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: POSIX :: Linux", "Operating System :: MacOS :: MacOS X", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Libraries :: Application Frameworks", "Typing :: Typed", ] dependencies = [ "aiohttp~=3.10", "aiolimiter~=1.1", "aiosubstrate~=0.1.0", "anyio~=4.4", "appdirs~=1.4", "APScheduler~=3.10", "async-lru~=2.0", "asyncpg~=0.29", "click~=8.1", # FIXME: 0.29 to 0.33.0 and higher; in `demo_tezos_dao`: tezos_storage.py:17:11: F821 Undefined name `bool_aliased` # See https://github.com/koxudaxi/datamodel-code-generator/issues/2431 "datamodel-code-generator==0.28.5", # pinned "debugpy>=1.8.15", "eth-abi~=5.0", "lru-dict~=1.3", "mcp~=1.9", "orjson~=3.10", "prometheus-client~=0.20", "pycryptodome~=3.20", "pydantic~=2.10.3", "pyhumps~=3.8", "pysignalr~=1.0", "python-dotenv~=1.0", "python-json-logger~=2.0", # pinned "ruamel.yaml~=0.18.6", "ruff~=0.13.2", "sentry-sdk~=2.16", "sqlparse~=0.5", "starknet-py~=0.28.0", "strict-rfc3339~=0.7", "survey~=5.4", "tabulate~=0.9", "tortoise-orm==0.25.1", # pinned "uvloop~=0.20", "web3~=7.2", ] [project.optional-dependencies] migrations = [ "aerich~=0.9.0", ] [project.urls] Homepage = "https://dipdup.io/" Documentation = "https://dipdup.io/docs" Repository = "https://github.com/dipdup-io/dipdup" [project.scripts] dipdup = "dipdup.cli:cli" [tool.ruff] line-length = 120 target-version = "py312" [tool.ruff.lint] ignore = [ "E402", # module level import not at top of file "E501", # line too long "TC001", # breaks our runtime Pydantic magic "UP046", # Generic function should use type parameters "UP047", # Generic class uses `Generic` subclass instead of type parameters "PTH211", # `os.symlink` should be replaced by `Path.symlink_to` ] extend-select = ["B", "C4", "FA", "G", "I", "PTH", "RET", "RUF", "TCH", "UP"] isort = { force-single-line = true, known-first-party = ["dipdup"] } [tool.ruff.format] quote-style = "single" [tool.mypy] python_version = "3.12" plugins = ["pydantic.mypy"] strict = true [[tool.mypy.overrides]] module = "ruamel" ignore_missing_imports = true [tool.pytest.ini_options] addopts="-n auto -s -v" asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" log_cli_level = "WARNING" filterwarnings = [ 'ignore:RemovedInMarshmallow4Warning', 'ignore:has no models', ] [tool.coverage.report] precision = 2 exclude_lines = [ "pragma: no cover", "def __repr__", "raise NotImplementedError", "raise FrameworkException", "if __name__ == .__main__.:", "class .*\\bProtocol\\):", "@(abc\\.)?abstractmethod", "if TYPE_CHECKING:", "if env.DEBUG:", ] [tool.uv] environments = [ "sys_platform == 'darwin'", "sys_platform == 'linux'", ] [build-system] requires = ["uv_build"] build-backend = "uv_build" [dependency-groups] lint = [ "mypy", "types-pytz", "types-tabulate", ] test = [ "docker", "pytest", "pytest-aiohttp", "pytest-asyncio", "pytest-cov", "pytest-xdist", ] docs = [ "Sphinx", "sphinx-click", "sphinx-markdown-builder", "watchdog", ] perf = [ "scalene", ]