-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathpyproject.toml
More file actions
79 lines (72 loc) · 3.11 KB
/
Copy pathpyproject.toml
File metadata and controls
79 lines (72 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
[project]
name = "famstack"
version = "0.3.0b1"
description = "Self-hosted family server stack for Apple Silicon"
requires-python = ">=3.11"
# The CLI itself depends only on the stdlib — stacklet containers carry
# their own runtime deps. These extras are for host-side tooling: tests
# and hook scripts that import bot modules directly.
[project.optional-dependencies]
test = [
"pytest>=8",
"pytest-asyncio>=0.21",
"pytest-httpserver>=1.0",
# Bot runtime deps — tests import the archivist and log into Matrix
# as test users, so the bot's own libraries must be installed here.
"matrix-nio>=0.25",
"aiohttp>=3.8",
"Pillow>=10",
"loguru",
"pyyaml",
"python-frontmatter>=1.0",
"markdown",
"pypdf>=4.0",
# PDF page rendering for vision-aware classifiers (scanned PDFs).
"pypdfium2>=4.0",
# URL → Markdown for the archivist's capture pipeline. Tests run
# trafilatura against fixture HTML in-process — no network calls.
"trafilatura>=1.12,<3.0",
# The framework LLM client (stack.ai.client) wraps the OpenAI SDK.
# Tests point it at a pytest-httpserver mock /v1 endpoint.
"openai>=1.50,<3.0",
# Strip quoted history + signatures from an email reply so the mail bot
# posts only the new message (stack.* / mail bot). Real lib in tests.
"email_reply_parser>=0.5",
# Convert HTML-only email bodies to Markdown (stack.email_message).
"html2text>=2024.2",
]
# Host-side tooling for generating the demo family-document set
# (tools/family-docs). Not needed to run the stack — only to render the
# example PDFs/images. reportlab lays out the native-text PDFs (clean
# text layer for the classifier); Pillow draws the scanned-look images.
demo = [
"reportlab>=4",
"Pillow>=10",
"pyyaml",
]
[tool.pytest.ini_options]
asyncio_mode = "auto"
# Pipeline-quality evals (real model, real Paperless, slow) are opt-in via
# `tests/integration/stacktests eval` — never collected by `pytest tests/`.
norecursedirs = ["tests/integration/eval"]
markers = [
"v2_only: tests for the lifecycle v2 refactor (will fail until migration is complete)",
"unverified: e2e intent specs not yet reconciled against the rig; non-blocking (xfail) until verified before the next beta tag",
]
[tool.ruff]
target-version = "py311"
[tool.ruff.lint]
# Ruff's default rule set: pyflakes (F) catches the real bugs — undefined
# names, unused imports and variables — alongside the pycodestyle import (E4),
# statement (E7) and runtime-error (E9) groups. Line-length (E5) is left off
# on purpose; the codebase favours long narrative docstrings.
select = ["E4", "E7", "E9", "F"]
[tool.ruff.lint.per-file-ignores]
# Stacklet CLI entrypoints and the test suite bootstrap sys.path so they can
# import the framework before it is on the default path — the module-level
# imports legitimately follow that setup, so E402 doesn't apply.
"stacklets/**/cli/**/*.py" = ["E402"]
"tests/**/*.py" = ["E402"]
# The top-level CLI wires up ~30 argparse subcommands with deliberate one-line
# `p = sub.add_parser(...); p.add_argument(...)` pairs — compact by design.
"lib/stack/cli.py" = ["E702"]