[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"

[project]
name = "snipe"
version = "0.3.0"
description = "Auction listing monitor and trust scorer"
requires-python = ">=3.11"
dependencies = [
    "circuitforge-core[community]>=0.8.0",
    "streamlit>=1.32",
    "requests>=2.31",
    "imagehash>=4.3",
    "Pillow>=10.0",
    "python-dotenv>=1.0",
    "beautifulsoup4>=4.12",
    "lxml>=5.0",
    "fastapi>=0.111",
    "python-multipart>=0.0.9",
    "uvicorn[standard]>=0.29",
    "playwright>=1.44",
    "playwright-stealth>=1.0",
    "cryptography>=42.0",
    "PyJWT>=2.8",
    "httpx>=0.27",
]

[project.optional-dependencies]
orchestration = [
    # Paid+ tier only — not published to PyPI. Install from source or Forgejo Packages.
    # pip install -e ../circuitforge-orch  (dev)
    # pip install snipe[orchestration]     (self-hosted Paid+)
    "circuitforge-orch>=0.1.0",
]
dev = [
    "pytest>=8.0",
    "pytest-cov>=5.0",
    "ruff>=0.4",
]

[tool.setuptools.packages.find]
where = ["."]
include = ["app*", "api*"]

[tool.pytest.ini_options]
testpaths = ["tests"]
markers = [
    "browser: tests that require a headed Chromium browser (Xvfb + playwright install required)",
]

[tool.ruff]
line-length = 100
target-version = "py311"

[tool.ruff.lint]
select = ["E", "F", "W", "I"]
ignore = [
  "E501",   # line length — handled by formatter
  "E402",   # module-import-not-at-top — intentional for conditional/lazy imports
  "E701",   # multiple-statements-colon — `if x: return y` is accepted style
  "E741",   # ambiguous variable name — l/q used intentionally for listing/query
]
