-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyproject.toml
More file actions
112 lines (103 loc) · 3.41 KB
/
Copy pathpyproject.toml
File metadata and controls
112 lines (103 loc) · 3.41 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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
[project]
name = "fastware"
version = "0.6.3"
description = "A batteries-included ASGI framework: msgspec JSON, a managed Granian server, dependency injection, SSE, WebSockets, auth, and a test client"
readme = "README.md"
requires-python = ">=3.11"
dependencies = [
"msgspec>=0.21.1",
"granian>=2.7,<3.0",
# 0.36.0 made effect classification mandatory; the `fastware` CLI declares
# `effect=` on all three dev commands and will not register on anything
# older. 0.41.0 made presence declared rather than inferred and banned a
# value `default=` on any flag of a `mutating` command, so the dev
# commands' flags declare `presence="optional"` and apply their fallback in
# the handler -- a spelling 0.40.x and older cannot parse.
"strictcli>=0.41.0",
]
keywords = [
"asgi",
"web-framework",
"msgspec",
"granian",
"sse",
"websockets",
"dependency-injection",
"rlsbl",
]
classifiers = [
"Programming Language :: Python :: 3",
"Intended Audience :: Developers",
"Framework :: AsyncIO",
"Topic :: Internet :: WWW/HTTP",
]
[project.urls]
Homepage = "https://smmh.dev/fastware/"
Documentation = "https://smmh.dev/fastware/"
Repository = "https://github.com/smm-h/fastware"
Issues = "https://github.com/smm-h/fastware/issues"
Changelog = "https://github.com/smm-h/fastware/blob/main/CHANGELOG.md"
[project.scripts]
fastware = "fastware.__main__:main"
[project.optional-dependencies]
auth = ["pyjwt", "bcrypt"]
logging = ["structlog"]
dev = ["httpx>=0.28", "watchfiles", "websockets"]
testing = ["httpx>=0.28"]
mcp = ["mcp"]
pydantic = ["pydantic"]
all = [
"fastware[auth]",
"fastware[logging]",
"fastware[dev]",
"fastware[testing]",
"fastware[mcp]",
"fastware[pydantic]",
]
[dependency-groups]
# Installing stricttest IS adoption of the test-isolation floor; the stance is
# declared in [tool.pytest.ini_options] below.
dev = [
"pytest",
"stricttest>=0.2.0",
"httpx>=0.28",
"pyjwt",
"bcrypt",
"structlog",
"watchfiles",
"websockets",
"mcp",
"pydantic",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/fastware"]
# Browser assets (service workers, registration snippet, update client) ship as
# package data alongside the Python source.
artifacts = ["src/fastware/_assets/*.js.tmpl"]
[tool.pytest.ini_options]
testpaths = ["tests"]
# The stricttest floor's stance. No implicit defaults exist: a missing key
# aborts the session at configure time.
stricttest_sockets = "deny"
stricttest_socket_allowlist = []
stricttest_unix_socket_allowlist = []
# `allow`, not `allowlist`. This suite runs REAL background servers: the
# serve/serve_background/supervise and granian-embed tests bind
# ("127.0.0.1", 0) and dial the result back, and `_probe_health` stands up a
# threaded HTTPServer the same way. The kernel assigns the port at bind time,
# so the host:port pair an exact allowlist would have to name does not exist
# at configuration time -- port 0 is inexpressible in an allowlist. Off-machine
# egress stays denied by `stricttest_sockets = "deny"`.
stricttest_loopback = "allow"
# No sandbox runner in this repo yet; the bwrap runner ships as an rlsbl
# scaffold template. Flip to "true" at adoption.
stricttest_sandbox_required = "false"
[tool.ruff]
line-length = 120
target-version = "py311"
[tool.ruff.lint]
select = ["E", "F", "W", "I"]
ignore = ["E501"]