-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathpyproject.toml
More file actions
180 lines (166 loc) · 6.63 KB
/
Copy pathpyproject.toml
File metadata and controls
180 lines (166 loc) · 6.63 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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
[build-system]
requires = ["setuptools>=61.0.0", "wheel>=0.37.0", "setuptools_scm>=6.4.0"]
build-backend = "setuptools.build_meta"
[tool.setuptools_scm]
version_scheme = "guess-next-dev"
local_scheme = "dirty-tag"
[project]
name = "workbench"
dynamic = ["version"]
description = "Workbench: A Dashboard and Python API for creating and deploying AWS SageMaker Model Pipelines"
readme = "README.md"
license = {file = "LICENSE"}
requires-python = ">=3.10"
keywords = ["SageMaker", "Machine Learning", "AWS", "Python", "Utilities"]
classifiers = [
"Development Status :: 4 - Beta",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Scientific/Engineering",
]
authors = [{ name = "SuperCowPowers LLC", email = "support@supercowpowers.com" }]
dependencies = [
# AWS clients & SDKs
# boto3/botocore/cryptography floors come from sagemaker-core's
# transitive requirements (sagemaker → sagemaker-core →
# boto3>=1.42.2, cryptography>=46.0.0).
"boto3 >= 1.42.2",
"botocore >= 1.42.2",
"awswrangler >= 3.4.0",
# sagemaker-core 2.13+ builds its main SageMaker client from the default
# credential chain, ignoring the passed boto3 session (pre-GA shim in
# sagemaker/core/utils/utils.py, marked "TODO: Remove post-launch").
# Breaks assumed-role runs: FeatureGroup offline stores get provisioned
# with the caller's SSO creds and fail on glue:GetDatabase. Cap both
# until fixed: https://github.com/aws/sagemaker-python-sdk/issues/5986
# The whole family is pinned (not just sagemaker-core): the sub-packages
# declare only floors on sagemaker-core, so without caps pip can mix
# generations (e.g. mlops 1.15 + core 2.12) and break at import time.
"sagemaker >= 3.6.0, < 3.13",
"sagemaker-core >= 2.12.0, < 2.13",
"sagemaker-mlops >= 1.12.0, < 1.13",
"sagemaker-serve >= 1.12.0, < 1.13",
"sagemaker-train >= 1.12.0, < 1.13",
"redis >= 5.0.1",
"cryptography >= 46.0.0",
"requests >= 2.26.0",
# aiobotocore floor — each release pins botocore to a one-minor window,
# so without this pip backtracks through every historical version hunting
# for a botocore match. Bump if installs feel slow again.
"aiobotocore >= 3.7.0",
# Data / ML
"pandas >= 2.2.1, < 3.0",
"scikit-learn >= 1.5.2",
"xgboost >= 3.0.3",
"joblib >= 1.3.2",
# Cheminformatics
"rdkit >= 2026.3.1",
"mordredcommunity >= 2.0.6",
# REPL & config
"ipython >= 8.37.0",
"pyreadline3; sys_platform == 'win32'",
# Terminal markdown rendering for the Bosco agent (tables, bold, lists)
"rich >= 13.0",
# Plotting (matplotlib lives here because workbench_shell has a show()
# command that's useful for showing 2D plots of chemical structures
"matplotlib >= 3.9.2",
# Pipeline orchestration (DAG building for pipeline specs)
"networkx >= 3.2",
# ML agent (Claude via Bedrock); the [bedrock] extra is just boto3/botocore
"anthropic[bedrock] >= 0.117.0",
]
[project.optional-dependencies]
misc = [
"umap-learn >= 0.5.8",
]
ui = [
"plotly >= 6.5.0",
"dash >= 4.0.0",
"dash-bootstrap-components >= 1.6.0",
"dash_ag_grid >= 33.3.3",
]
# Training-container-only deps (the workbench.training surface). Never installed
# in endpoint containers — being a non-dev extra, these auto-extend the
# endpoint-import-smoke forbidden list, so any leak into workbench.endpoints fails CI.
training = [
"ray[tune]",
"optuna",
]
dev = ["pytest", "pytest-sugar", "pytest-xdist", "coverage", "pytest-cov", "flake8", "black", "aws-cdk-lib"]
# Docs toolchain (mkdocs site + mkdocstrings API reference). Kept in sync with .github/workflows/deploy-docs.yml
docs = [
# Cap mkdocs/material below 2.0/10 — MkDocs 2.0 is a breaking rewrite that Material 10 will require
"mkdocs >=1.6,<2.0",
"mkdocs-material >=9.7,<10",
"mkdocstrings",
"mkdocstrings-python",
]
all = [
"workbench[ui]",
"workbench[dev]",
"workbench[misc]",
"workbench[docs]",
]
[project.urls]
Homepage = "https://github.com/SuperCowPowers/workbench"
[tool.setuptools]
package-dir = {"" = "src"}
packages = { find = { where = ["src"] } }
[tool.setuptools.package-data]
"workbench" = [
"resources/signature_verify_pub.pem",
"resources/open_source_api.key",
"model_scripts/**",
"themes/**",
"agent/guides/*.md"
]
[tool.setuptools.exclude-package-data]
"workbench" = ["model_scripts/**/generated_*.py"]
[project.scripts]
workbench = "workbench.repl.workbench_shell:launch_shell"
bosco = "workbench.repl.workbench_shell:launch_shell"
cloud_watch = "workbench.scripts.monitor_cloud_watch:main"
workbench_config = "workbench.scripts.show_config:main"
df_store = "workbench.scripts.df_store:main"
glue_launcher = "workbench.scripts.glue_launcher:main"
ml_pipeline_batch = "workbench.scripts.ml_pipeline_batch:main"
ml_pipeline_sqs = "workbench.scripts.ml_pipeline_sqs:main"
ml_pipeline_launcher = "workbench.scripts.ml_pipeline_launcher:main"
ensemble_sim = "workbench.scripts.ensemble_sim:main"
lambda_test = "workbench.scripts.lambda_test:main"
endpoint_test = "workbench.scripts.endpoint_test:main"
training_test = "workbench.scripts.training_test:main"
redis_tunnel = "workbench.scripts.redis_tunnel:main"
bedrock_verify = "workbench.scripts.bedrock_verify:main"
[tool.uv]
# torch arrives transitively via sagemaker-serve (unconstrained); this floor
# stops uv's universal resolver from picking a py313-incompatible old build.
# A constraint bounds the transitive version without declaring torch as our dep.
constraint-dependencies = ["torch >= 2.13"]
[tool.black]
line-length = 120
# Supported Python versions; keeps black from auto-targeting a newer one and
# warning when run under an older interpreter.
target-version = ["py310", "py311", "py312", "py313"]
# Also format the model-script .template files (valid Python; jinja placeholders
# live inside string literals). Default include is (\.pyi?)$.
include = '(\.pyi?|\.template)$'
[tool.pytest.ini_options]
addopts = "-v --cov=workbench --cov-report term-missing"
python_files = "*.py"
python_functions = "test"
norecursedirs = [".tox", ".git", "*.egg-info", "__pycache__", "dist", "build"]
markers = [
"medium: marks heavier validation tests excluded from quick runs (run with 'tox -e medium')",
"long: marks tests as long (deselect with '-m \"not long\"')",
"corner_case: marks corner case tests not run by default (deselect with '-m \"not corner_case\"')"
]
[tool.coverage.run]
relative_files = true
[tool.coverage.report]
exclude_lines = [
"if __name__ == .__main__.",
"pragma: no cover",
]