- Web UI: login, dashboard, links CRUD, collections, API keys, admin pages - Query engine: AND/OR/XOR with field filters, tag search, preview endpoint - Session management: token expiry detection, 401 interceptor, expiry banner - Links search: tags included, multi-word AND, query mode with set operations - Collections: static/dynamic, query builder with preview, public tree view - Save as Collection: convert search results (static) or query (dynamic) - Dashboard stats: resilient loading with allSettled pattern - Login page: redesigned with public collections tree view - Bug fix: query executor None fields crash (notes/description/url/title) - E2E tests: 20 Playwright tests covering all critical user flows - All 104 tests passing (84 unit/integration + 20 E2E)
55 lines
1.2 KiB
TOML
55 lines
1.2 KiB
TOML
# LinkSyncServer Project Configuration
|
|
[build-system]
|
|
requires = ["setuptools>=61.0"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "linksync-server"
|
|
version = "1.0.0"
|
|
description = "Self-hosted bookmark server with advanced collection capabilities"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"fastapi==0.109.0",
|
|
"uvicorn[standard]==0.27.0",
|
|
"sqlalchemy==2.0.25",
|
|
"psycopg2-binary==2.9.9",
|
|
"alembic==1.13.1",
|
|
"python-jose[cryptography]==3.3.0",
|
|
"bcrypt==4.1.2",
|
|
"jinja2==3.1.3",
|
|
"pydantic==2.6.1",
|
|
"bcrypt==4.1.2",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest==8.0.0",
|
|
"pytest-cov==4.1.0",
|
|
"ruff==0.1.0",
|
|
"mypy==1.8.0",
|
|
]
|
|
|
|
[tool.setuptools.packages.find]
|
|
where = ["."]
|
|
include = ["linksync_server*"]
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py"]
|
|
python_functions = ["test_*"]
|
|
addopts = "-v --tb=short"
|
|
filterwarnings = ["ignore::DeprecationWarning"]
|
|
markers = ["e2e: End-to-end Playwright tests"]
|
|
|
|
[tool.ruff]
|
|
line-length = 88
|
|
target-version = "py312"
|
|
|
|
[tool.ruff.lint]
|
|
select = ["E", "F", "I", "N"]
|
|
ignore = ["E501", "E741"]
|
|
|
|
[tool.mypy]
|
|
python_version = "3.12"
|
|
warn_return_any = true
|
|
warn_unused_configs = true |