[build-system] requires = ["setuptools>=65.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "pote" version = "0.1.0" description = "Public Officials Trading Explorer – research-only transparency tool" readme = "README.md" requires-python = ">=3.10" license = {text = "MIT"} authors = [ {name = "POTE Research", email = "research@example.com"} ] dependencies = [ "sqlalchemy>=2.0", "alembic>=1.13", "pydantic>=2.0", "pydantic-settings>=2.0", "pandas>=2.0", "numpy>=1.24", "httpx>=0.25", "yfinance>=0.2.35", "python-dotenv>=1.0", "click>=8.1", ] [project.optional-dependencies] dev = [ "pytest>=7.4", "pytest-cov>=4.1", "pytest-asyncio>=0.21", "ruff>=0.1", "black>=23.0", "mypy>=1.7", "ipython>=8.0", ] analytics = [ "scikit-learn>=1.3", "matplotlib>=3.7", "plotly>=5.18", ] api = [ "fastapi>=0.104", "uvicorn[standard]>=0.24", ] [tool.setuptools.packages.find] where = ["src"] [tool.black] line-length = 100 target-version = ["py310", "py311"] [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade ] ignore = [ "E501", # line too long (handled by black) ] [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] "tests/*.py" = ["B011"] # allow assert False in tests [tool.mypy] python_version = "3.10" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = false ignore_missing_imports = true [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = "-v --strict-markers --tb=short" markers = [ "integration: marks tests as integration tests (require DB/network)", "slow: marks tests as slow", ]