[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "pyfragment" version = "2026.3.2" description = "Async Python client for the Fragment API. Buy Stars and Premium, top up TON and Ads balances, run giveaways, manage anonymous numbers, and search Fragment listings." readme = "README.md" license = { text = "MIT" } requires-python = ">=3.10" authors = [{ name = "bohd4nx" }] keywords = [ "fragment", "fragment-api", "telegram", "telegram-api", "telegram-stars", "telegram-premium", "telegram-giveaway", "telegram-ads", "ton", "ton-blockchain", "tonapi", "anonymous-numbers", "username-auctions", "gift-marketplace", "crypto-payments", "nft-marketplace", "web3", "python-client", "typed", "asyncio", ] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Framework :: AsyncIO", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Internet", "Topic :: Internet :: WWW/HTTP", "Typing :: Typed", ] dependencies = ["httpx>=0.25", "tonutils>=2.0.1"] [project.optional-dependencies] dev = ["pytest", "pytest-asyncio", "pytest-mock", "mypy", "ruff"] browser = ["rookiepy>=0.5.6"] [project.urls] Homepage = "https://github.com/bohd4nx/pyfragment" Repository = "https://github.com/bohd4nx/pyfragment" Documentation = "https://bohd4nx.gitbook.io/pyfragment/" Issues = "https://github.com/bohd4nx/pyfragment/issues" Changelog = "https://github.com/bohd4nx/pyfragment/blob/master/CHANGELOG.md" [tool.hatch.build.targets.wheel] packages = ["pyfragment"] [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["[0-9][0-9][0-9]_test_*.py"] asyncio_mode = "auto" addopts = "-v --tb=short" [tool.ruff] line-length = 128 target-version = "py310" [tool.ruff.lint] # E — pycodestyle errors, F — pyflakes, W — warnings, I — isort, UP — pyupgrade select = ["E", "F", "W", "I", "UP"] # E501 — line too long (covered by line-length above) # UP017 — use datetime.UTC (only available in Python 3.11+, we support 3.10) ignore = ["E501", "UP017"] [tool.ruff.lint.per-file-ignores] "tests/*" = ["E402"] [tool.mypy] python_version = "3.10" strict = true exclude = ["^examples/"] [[tool.mypy.overrides]] module = "rookiepy" ignore_missing_imports = true [[tool.mypy.overrides]] # rookiepy = None assignment is valid when the package is installed (type: ModuleType) # but mypy on CI (without rookiepy) sees it as Any and flags the comment as unused. module = "pyfragment.core.cookies" warn_unused_ignores = false