[project] name = "moltbook-analysis" version = "0.1.0" description = "Production-grade web crawler for Moltbook.com AI agent research" authors = [{ name = "Moltbook-analysis Team" }] readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } keywords = ["crawler", "scraper", "moltbook", "ai-agents", "research"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Internet :: WWW/HTTP :: Indexing/Search", ] dependencies = [ # HTTP client (async) "aiohttp>=3.9.0", "aiohttp-retry>=2.8.0", # Headless browser (JS rendering) "camoufox>=0.4.0", "playwright>=1.40.0", # Redis "redis>=5.0.0", "hiredis>=2.3.0", # Data processing "polars>=0.20.0", "pyarrow>=15.0.0", # NLP / Anonymization "presidio-analyzer>=2.2.0", "presidio-anonymizer>=2.2.0", "spacy>=3.7.0", # HTML parsing "beautifulsoup4>=4.12.0", "lxml>=5.0.0", "selectolax>=0.3.0", # Configuration "pydantic>=2.5.0", "pydantic-settings>=2.1.0", "pyyaml>=6.0.0", # CLI "typer>=0.9.0", "rich>=13.7.0", # Logging "structlog>=24.1.0", # Monitoring "prometheus-client>=0.19.0", "psutil>=5.9.0", # Utilities "python-dateutil>=2.8.0", "tenacity>=8.2.0", "ulid-py>=1.1.0", "mmh3>=4.0.0", # MurmurHash3 for bloom filter "xxhash>=3.4.0", # Fast hashing for SimHash ] [project.optional-dependencies] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.23.0", "pytest-cov>=4.1.0", "aioresponses>=0.7.0", "fakeredis>=2.21.0", "mypy>=1.8.0", "ruff>=0.2.0", "pre-commit>=3.6.0", ] [project.scripts] moltbook-analysis = "moltbook_analysis.cli.main:app" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/moltbook_analysis"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] addopts = "-v --cov=moltbook_analysis --cov-report=term-missing" [tool.ruff] target-version = "py311" line-length = 100 src = ["src"] [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP", "B", "C4", "SIM", "ASYNC"] ignore = ["E501"] # Line length handled by formatter [tool.ruff.lint.isort] known-first-party = ["moltbook_analysis"] [tool.mypy] python_version = "3.11" strict = true plugins = ["pydantic.mypy"] exclude = ["tests"] [tool.coverage.run] source = ["src/moltbook_analysis"] branch = true [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise NotImplementedError", "if TYPE_CHECKING:", ]