Files
Priceflow/pyproject.toml
T
Claude 1116c3a648 feat: Add multi-site product search system with SearXNG integration
This commit adds a comprehensive product search feature that allows users
to search for products across multiple configured e-commerce sites.

Backend changes:
- Add SearXNG service to docker-compose for meta-search capability
- Add SearchSite model and Alembic migration with default sites
- Create searxng_service.py for search queries across sites
- Create light_scraper_service.py for fast HTTP-based extraction
- Create search_service.py orchestrator combining SearXNG + HTTP + Browserless
- Add API endpoints for search (/api/search) with SSE streaming
- Add CRUD endpoints for search sites (/api/search-sites)

Frontend changes:
- Add new /search page with real-time results display
- Create SearchResultCard component for product display
- Add Progress, Checkbox, and Badge UI components
- Update Settings page with search sites management section
- Add navigation link to search page
- Create new modern SVG logo with price-flow gradient design
- Update favicon to SVG format

The search system uses a hybrid approach:
1. SearXNG finds product URLs across configured sites
2. Light HTTP scraper attempts fast extraction
3. Falls back to Browserless for JavaScript-heavy sites
4. Results stream progressively via SSE
2025-11-22 11:03:48 +00:00

100 lines
1.8 KiB
TOML

[project]
name = "priceflow-backend"
version = "0.1.0"
description = "Backend for PriceFlow Price Tracker"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"fastapi",
"uvicorn",
"sqlalchemy",
"psycopg2-binary",
"playwright",
"requests",
"httpx",
"pydantic",
"apprise",
"Pillow",
"apscheduler",
"python-multipart",
"pydantic-settings",
"aiofiles",
"litellm",
"alembic",
"tenacity",
"slowapi",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["app"]
[project.optional-dependencies]
dev = [
"pytest",
"pytest-asyncio",
"pytest-cov",
"ruff",
"httpx",
"mypy",
"bandit",
"pip-audit",
"pre-commit",
]
[tool.hatch.envs.default]
dependencies = [
"pytest",
"ruff",
"httpx",
]
[tool.ruff]
line-length = 120
target-version = "py312"
[tool.ruff.lint]
select = ["E", "F", "I", "W", "B", "UP", "PL", "RUF"]
ignore = []
[tool.ruff.lint.per-file-ignores]
"tests/*" = ["PLR2004"]
"app/routers/*" = ["B008"]
"app/main.py" = ["B008"]
[tool.pytest.ini_options]
pythonpath = ["."]
testpaths = ["tests"]
addopts = "--cov=app --cov-report=html --cov-report=term-missing"
asyncio_mode = "auto"
[tool.coverage.run]
source = ["app"]
omit = ["*/tests/*", "*/alembic/*"]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"def __repr__",
"raise AssertionError",
"raise NotImplementedError",
"if __name__ == .__main__.:",
"if TYPE_CHECKING:",
"@abstractmethod",
]
[tool.mypy]
python_version = "3.12"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = false # Enable gradually
ignore_missing_imports = true
[tool.bandit]
exclude_dirs = ["tests", "app/alembic"]
skips = ["B101"] # Skip assert_used (common in tests)