Cloud/session: - fix(_extract_session_token): return "" for non-JWT cookie strings (snipe_guest=uuid was triggering 401 → forced login redirect for all unauthenticated cloud visitors) - fix(affiliate): exclude guest: and anonymous users from pref-store writes (#38) - fix(market-comp): use enriched comp_query for market comp hash so write/read keys match (#30) Frontend: - feat(SearchView): unauthenticated landing strip with free-account CTA (#36) - feat(SearchView): aria-pressed on filter toggles, aria-label on icon buttons, focus-visible rings on all interactive controls, live region for result count (#35) - feat(SearchView): no-results empty-state hint text (#36) - feat(SEO): og:image 1200x630, summary_large_image twitter card, canonical link (#37) - feat(OG): generated og-image.png (dark tactical theme, feature pills) (#37) - feat(settings): TrustSignalPref view wired to /settings route (#28) - fix(router): /settings route added; unauthenticated access redirects to home (#34) CI/CD: - feat(ci): Forgejo Actions workflow (ruff + pytest + vue-tsc + vitest) (#22) - feat(ci): mirror workflow (GitHub + Codeberg on push to main/tags) (#22) - feat(ci): release workflow (Docker build+push + git-cliff changelog) (#22) - chore: git-cliff config (.cliff.toml) for conventional commit changelog (#22) - chore(pyproject): dev extras (pytest/ruff/httpx), ruff config with ignore list (#22) Lint: - fix: remove 11 unused imports across api/, app/, tests/ (ruff F401 clean)
54 lines
1.3 KiB
TOML
54 lines
1.3 KiB
TOML
[build-system]
|
|
requires = ["setuptools>=68"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "snipe"
|
|
version = "0.2.0"
|
|
description = "Auction listing monitor and trust scorer"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"circuitforge-core>=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",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest>=8.0",
|
|
"pytest-cov>=5.0",
|
|
"ruff>=0.4",
|
|
"httpx>=0.27", # FastAPI test client
|
|
]
|
|
|
|
[tool.setuptools.packages.find]
|
|
where = ["."]
|
|
include = ["app*", "api*"]
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
|
|
[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
|
|
]
|