Adds src/application/ingestion/ -- Persian normalization, DOCX body walk with structural data/layout table classification, CSV/XLSX row rendering, and fixed-size token chunking (cl100k_base, 400/60/512) -- as pure functions per ADR-0015, tested against real production documents (asia_data_sample, kept out of the repo). ADR-0018 records where this diverges from ADR-0004 (fixed-size default, no invented headings/tree, structural table classification, header-provable labeling only). Plan 001's scope line is corrected from CSV-only to DOCX/XLSX/CSV, and CLAUDE.md's stale project-status paragraph is updated to match current implementation state.
95 lines
2.0 KiB
TOML
95 lines
2.0 KiB
TOML
[project]
|
|
name = "new-chatbot"
|
|
version = "0.1.0"
|
|
description = "Add your description here"
|
|
readme = "README.md"
|
|
requires-python = ">=3.13"
|
|
dependencies = [
|
|
"alembic>=1.19.1",
|
|
"anyio>=4.11.0",
|
|
"asyncpg>=0.31.0",
|
|
"fastapi[standard]==0.141.1",
|
|
"langgraph>=1.2.10",
|
|
"minio>=7.2.20",
|
|
"openpyxl>=3.1.5",
|
|
"pydantic-settings>=2.15.0",
|
|
"python-docx>=1.2.0",
|
|
"qdrant-client>=1.19.0",
|
|
"sqlalchemy>=2.0.51",
|
|
"structlog>=26.1.0",
|
|
"tiktoken>=0.13.0",
|
|
]
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"asgi-lifespan>=2.1.0",
|
|
"httpx>=0.28.1",
|
|
"pytest>=8.3.5",
|
|
"pytest-asyncio>=0.25.3",
|
|
"pytest-cov>=6.0.0",
|
|
"pytest-timeout>=2.3.1",
|
|
"ruff>=0.16.2",
|
|
"testcontainers>=4.9.2",
|
|
"ty>=0.0.69",
|
|
]
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
asyncio_mode = "strict"
|
|
timeout = 10
|
|
markers = [
|
|
"unit: fast tests with no external services",
|
|
"integration: tests against a real disposable service",
|
|
"e2e: end-to-end vertical-slice tests",
|
|
"postgres: integration test using Postgres",
|
|
"minio: integration test using MinIO",
|
|
"qdrant: integration test using Qdrant",
|
|
"slow: test exceeds normal integration feedback time",
|
|
"live_provider: opt-in test that calls an external provider",
|
|
]
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|
|
target-version = "py313"
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
# pycodestyle
|
|
"E",
|
|
# pyflakes
|
|
"F",
|
|
# isort
|
|
"I",
|
|
# pyupgrade
|
|
"UP",
|
|
# flake8-bugbear
|
|
"B",
|
|
# flake8-comprehensions
|
|
"C4",
|
|
# flake8-simplify
|
|
"SIM",
|
|
# Ruff-specific rules
|
|
"RUF",
|
|
]
|
|
|
|
[tool.ruff.format]
|
|
quote-style = "double"
|
|
indent-style = "space"
|
|
|
|
[tool.ty.environment]
|
|
python-version = "3.13"
|
|
|
|
[tool.ty.rules]
|
|
# High-value, currently ignore/warn by
|
|
possibly-unresolved-reference = "error"
|
|
missing-type-argument = "warn"
|
|
possibly-missing-attribute = "warn"
|
|
|
|
# Nice-to-have discipline:
|
|
unused-ignore-comment = "warn"
|
|
missing-override-decorator = "warn"
|
|
|
|
# Turn OFF or downgrade if noisy on your codebase:
|
|
possibly-missing-import = "ignore"
|
|
division-by-zero = "ignore"
|