-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyproject.toml
More file actions
137 lines (125 loc) · 4.49 KB
/
Copy pathpyproject.toml
File metadata and controls
137 lines (125 loc) · 4.49 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
[build-system]
# PEP 639 (`license = "MIT"` plus `license-files`) needs setuptools 77 or newer.
# Without pinning it here the build environment resolves whatever it likes, and
# an older setuptools rejects the string form of the licence field.
requires = ["setuptools>=77"]
build-backend = "setuptools.build_meta"
[project]
name = "bbschedule"
version = "0.3.0"
description = "Construction scheduling with a verifiable CPM engine and DCMA 14-point schedule quality assessment"
readme = "README.md"
requires-python = ">=3.11"
license = "MIT"
license-files = ["LICENSE"]
authors = [{ name = "Matthew M. Emma" }]
dependencies = [
"flask>=3.1.2,<4",
"flask-sqlalchemy>=3.1.1,<4",
"flask-login>=0.6.3,<1",
"flask-migrate>=4.1.0,<5",
"flask-wtf>=1.2.2,<2",
"flask-limiter>=3.12,<5",
"flask-caching>=2.3.1,<3",
"flask-talisman>=1.1.0,<2",
"sqlalchemy>=2.0.43,<3",
"werkzeug>=3.1.3,<4",
"python-dotenv>=1.1.1,<2",
"python-dateutil>=2.9.0.post0,<3",
"email-validator>=2.3.0,<3",
"gunicorn>=23.0.0,<27",
"psutil>=7.0.0,<8",
"requests>=2.32.5,<3",
]
[project.optional-dependencies]
# PostgreSQL. Development runs on SQLite with no extra dependency.
postgres = ["psycopg2-binary>=2.9.10,<3"]
# Background processing and shared cache.
async = ["celery>=5.5.3,<6", "redis>=6.4.0,<9"]
# Cloud and third-party integrations. All of these are optional; the platform
# degrades to deterministic scheduling without them.
integrations = [
"azure-core>=1.35.0,<2",
"azure-identity>=1.24.0,<2",
"azure-storage-blob>=12.26.0,<13",
"openai>=1.106.1,<3",
"stripe>=12.5.1,<16",
"openpyxl>=3.1.5,<4",
"pyjwt>=2.10.1,<3",
"oauthlib>=3.3.1,<4",
"flask-dance>=7.1.0,<8",
]
# Reading binary .mpp needs MPXJ, which is a Java library reached through
# JPype — so this extra pulls in a JVM requirement. Everything else, including
# reading and writing XER and MSPDI XML, is pure Python.
mpp = [
"mpxj>=13,<17",
"jpype1>=1.5,<2",
]
dev = [
# Test tooling is pinned to a major for the same reason as ruff: a release
# on someone else's schedule must not fail a build nobody touched.
"pytest>=8.0,<10",
"pytest-cov>=5.0,<8",
# tests/test_deployment.py reads the CI workflow to check that the Python
# version the image ships is a version some test job actually runs.
"pyyaml>=6.0,<8",
# Pinned: a formatter that floats breaks CI on its own release schedule,
# with no change to this codebase. Bump deliberately.
"ruff==0.16.2",
]
[tool.setuptools]
# A flat layout with this many top-level directories defeats setuptools'
# automatic discovery, which then refuses to build at all. Listing the packages
# explicitly is what makes `pip install .` — and so the Docker image — work.
packages = [
"admin",
"analytics",
"audit",
"azure_ai",
"blueprints",
"caching",
"collaboration",
"config",
"core",
"database",
"monitoring",
"reports",
"security",
"services",
"tasks",
]
py-modules = ["app", "extensions", "main", "models", "routes", "seed_demo"]
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["."]
addopts = "-q"
markers = [
# Migration tests shell out to the Flask CLI and build real databases, so
# they run in seconds rather than milliseconds. Skip with -m "not slow".
"slow: spawns a subprocess and builds a database",
# Needs the mpp extra and a JVM. Skipped automatically without them, so a
# normal `pytest` run is unaffected — but CI installs both and runs them,
# because otherwise the MPXJ bridge is code nobody has ever executed.
"mpp: needs MPXJ and a JVM",
]
filterwarnings = ["error::DeprecationWarning:core.*"]
[tool.ruff]
line-length = 100
target-version = "py311"
# Markdown is excluded deliberately. Recent ruff reformats Python code fences
# inside .md files, which rewrites documentation prose — including the
# deliberately aligned comments in the README's example — as a side effect of
# linting the application. Documentation is edited by hand.
exclude = [".venv", "migrations", "*.md"]
[tool.ruff.lint]
select = ["E", "F", "W", "I", "UP", "B", "C4"]
# E501: line length is handled by the formatter.
# UP017: datetime.UTC is 3.11+ only.
# UP042: enum.StrEnum is 3.11+ only.
# Both keep the pure-Python modules in `core` importable from any 3.9+ tool
# that vendors them, which is the point of keeping that package dependency-free.
ignore = ["E501", "UP017", "UP042"]
[tool.coverage.run]
source = ["core", "services"]
omit = ["*/tests/*"]