pythoncharmers-meta 0.7.16__tar.gz → 0.8.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,325 @@
1
+ Metadata-Version: 2.5
2
+ Name: pythoncharmers-meta
3
+ Version: 0.8.2
4
+ Summary: Meta package with dependencies for Python Charmers training courses
5
+ License-File: LICENSE
6
+ Requires-Python: >=3.10
7
+ Requires-Dist: black>=26.5.1
8
+ Requires-Dist: diskcache>=5.6.3
9
+ Requires-Dist: humanize>=4.16.0
10
+ Requires-Dist: hvplot>=0.12.2
11
+ Requires-Dist: ipython>=8.39.0
12
+ Requires-Dist: isort>=9.0.1
13
+ Requires-Dist: keyring>=25.7.0
14
+ Requires-Dist: keyrings-cryptfile>=1.3.9
15
+ Requires-Dist: llm>=0.32.1
16
+ Requires-Dist: loguru>=0.7.2
17
+ Requires-Dist: logzero>=1.7.0
18
+ Requires-Dist: lxml>=6.1.3
19
+ Requires-Dist: matplotlib>=3.10.9
20
+ Requires-Dist: more-itertools>=11.1.0
21
+ Requires-Dist: mypy>=2.3.1
22
+ Requires-Dist: natural>=0.2.0
23
+ Requires-Dist: nbformat>=5.11.1
24
+ Requires-Dist: numba>=0.62.1
25
+ Requires-Dist: numexpr>=2.14.1
26
+ Requires-Dist: numpy>=2.2.0
27
+ Requires-Dist: openpyxl>=3.1.5
28
+ Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,xml]>=2.3.3
29
+ Requires-Dist: parse>=1.22.2
30
+ Requires-Dist: plotly!=6.0.*,>=7.1.0
31
+ Requires-Dist: polars[excel,graph,numpy,plot,pyarrow,pydantic,style,timezone]>=1.44.2
32
+ Requires-Dist: psutil>=7.2.2
33
+ Requires-Dist: pydantic>=2.13.5
34
+ Requires-Dist: pytest>=9.1.1
35
+ Requires-Dist: requests>=2.34.2
36
+ Requires-Dist: rich>=15.0.0
37
+ Requires-Dist: ruff>=0.16.9
38
+ Requires-Dist: schedule>=1.2.2
39
+ Requires-Dist: streamlit>=1.56.0
40
+ Requires-Dist: toolz>=1.1.0
41
+ Requires-Dist: tqdm>=4.70.1
42
+ Requires-Dist: ty>=0.0.84
43
+ Requires-Dist: typer>=0.27.2
44
+ Requires-Dist: zstandard>=0.25.0
45
+ Provides-Extra: analytics
46
+ Requires-Dist: altair>=6.2.2; extra == 'analytics'
47
+ Requires-Dist: bokeh>=3.9.2; extra == 'analytics'
48
+ Requires-Dist: bottleneck>=1.6.0; extra == 'analytics'
49
+ Requires-Dist: connectorx>=0.4.6; extra == 'analytics'
50
+ Requires-Dist: darts[notorch]>=0.46.0; extra == 'analytics'
51
+ Requires-Dist: dask>=2026.8.0; extra == 'analytics'
52
+ Requires-Dist: distributed>=2026.8.0; extra == 'analytics'
53
+ Requires-Dist: duckdb>=1.5.5; extra == 'analytics'
54
+ Requires-Dist: fastexcel>=0.21.0; extra == 'analytics'
55
+ Requires-Dist: formulaic>=1.2.2; extra == 'analytics'
56
+ Requires-Dist: glum>=3.4.1; extra == 'analytics'
57
+ Requires-Dist: graphviz>=0.21; extra == 'analytics'
58
+ Requires-Dist: holoviews>=1.23.2; extra == 'analytics'
59
+ Requires-Dist: hvplot>=0.12.2; extra == 'analytics'
60
+ Requires-Dist: ibis-framework[duckdb,polars,sqlite]>=12.0.0; extra == 'analytics'
61
+ Requires-Dist: matplotlib>=3.10.9; extra == 'analytics'
62
+ Requires-Dist: networkx>=3.3; extra == 'analytics'
63
+ Requires-Dist: numba>=0.62.1; extra == 'analytics'
64
+ Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3; extra == 'analytics'
65
+ Requires-Dist: pandera[mypy,pandas,polars]>=0.33.1; extra == 'analytics'
66
+ Requires-Dist: pyod>=3.6.6; extra == 'analytics'
67
+ Requires-Dist: scikit-learn>=1.7.2; extra == 'analytics'
68
+ Requires-Dist: scipy>=1.15.3; extra == 'analytics'
69
+ Requires-Dist: seaborn>=0.13.2; extra == 'analytics'
70
+ Requires-Dist: statsmodels>=0.15.0; extra == 'analytics'
71
+ Requires-Dist: streamlit>=1.56.0; extra == 'analytics'
72
+ Requires-Dist: tables>=3.10.1; extra == 'analytics'
73
+ Requires-Dist: textblob>=0.20.1; extra == 'analytics'
74
+ Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'analytics'
75
+ Provides-Extra: bio
76
+ Requires-Dist: anndata>=0.11.4; extra == 'bio'
77
+ Requires-Dist: biopython>=1.88; extra == 'bio'
78
+ Requires-Dist: igraph>=1.0.0; extra == 'bio'
79
+ Requires-Dist: leidenalg>=0.12.0; extra == 'bio'
80
+ Requires-Dist: paramiko>=5.0.0; extra == 'bio'
81
+ Requires-Dist: pooch>=1.9.0; extra == 'bio'
82
+ Requires-Dist: scanpy>=1.11.5; extra == 'bio'
83
+ Requires-Dist: scikit-image>=0.25.2; extra == 'bio'
84
+ Requires-Dist: scikit-misc>=0.5.2; extra == 'bio'
85
+ Requires-Dist: tqdm>=4.70.1; extra == 'bio'
86
+ Provides-Extra: db
87
+ Requires-Dist: duckdb>=1.5.5; extra == 'db'
88
+ Requires-Dist: ibis-framework[duckdb,polars,sqlite]>=12.0.0; extra == 'db'
89
+ Requires-Dist: pandas[sql-other]>=2.3.3; extra == 'db'
90
+ Requires-Dist: polars[database]>=1.44.2; extra == 'db'
91
+ Requires-Dist: pyodbc>=5.3.0; extra == 'db'
92
+ Requires-Dist: redis>=8.1.0; extra == 'db'
93
+ Requires-Dist: sqlalchemy>=2.0.54; extra == 'db'
94
+ Provides-Extra: dl
95
+ Requires-Dist: albumentations>=2.0.8; extra == 'dl'
96
+ Requires-Dist: darts[torch]>=0.46.0; extra == 'dl'
97
+ Requires-Dist: dataset>=2.0.0; extra == 'dl'
98
+ Requires-Dist: datasets>=5.0.1; extra == 'dl'
99
+ Requires-Dist: diskcache>=5.6.3; extra == 'dl'
100
+ Requires-Dist: eli5>=0.15.0; extra == 'dl'
101
+ Requires-Dist: evaluate>=0.4.6; extra == 'dl'
102
+ Requires-Dist: joblib>=1.6.0; extra == 'dl'
103
+ Requires-Dist: lightning>=2.6.6; extra == 'dl'
104
+ Requires-Dist: prophet>=1.4.0; extra == 'dl'
105
+ Requires-Dist: pyod>=3.6.6; extra == 'dl'
106
+ Requires-Dist: scikit-learn>=1.7.2; extra == 'dl'
107
+ Requires-Dist: skorch>=1.4.0; extra == 'dl'
108
+ Requires-Dist: skrub>=0.10.1; extra == 'dl'
109
+ Requires-Dist: tensorboard>=2.21.0; extra == 'dl'
110
+ Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'dl'
111
+ Requires-Dist: torch>=2.2.2; extra == 'dl'
112
+ Requires-Dist: torchaudio>=2.2.2; extra == 'dl'
113
+ Requires-Dist: torchvision>=0.17.2; extra == 'dl'
114
+ Requires-Dist: transformers[torch]>=5.0.0; extra == 'dl'
115
+ Requires-Dist: xgboost>=3.2.0; extra == 'dl'
116
+ Requires-Dist: yellowbrick2>=2.0.2; extra == 'dl'
117
+ Provides-Extra: docs
118
+ Requires-Dist: black>=26.5.1; extra == 'docs'
119
+ Requires-Dist: jupyter-cache; extra == 'docs'
120
+ Requires-Dist: jupyter-core; extra == 'docs'
121
+ Requires-Dist: kaleido>=1.4.0; extra == 'docs'
122
+ Requires-Dist: nbclient>=0.11.0; extra == 'docs'
123
+ Provides-Extra: gis
124
+ Requires-Dist: cartopy>=0.25.0; extra == 'gis'
125
+ Requires-Dist: cftime>=1.6.5; extra == 'gis'
126
+ Requires-Dist: contextily>=1.7.1; extra == 'gis'
127
+ Requires-Dist: dask-image>=2026.5.0; extra == 'gis'
128
+ Requires-Dist: datashader>=0.19.1; extra == 'gis'
129
+ Requires-Dist: descartes>=1.1.0; extra == 'gis'
130
+ Requires-Dist: fiona>=1.10.0; extra == 'gis'
131
+ Requires-Dist: folium>=0.20.0; extra == 'gis'
132
+ Requires-Dist: geoalchemy>=0.7.2; extra == 'gis'
133
+ Requires-Dist: geopandas>=1.1.4; extra == 'gis'
134
+ Requires-Dist: geopy>=2.5.0; extra == 'gis'
135
+ Requires-Dist: graphviz>=0.21; extra == 'gis'
136
+ Requires-Dist: h5netcdf>=1.8.1; extra == 'gis'
137
+ Requires-Dist: iris>=1.0.7; extra == 'gis'
138
+ Requires-Dist: netcdf4>=1.7.3; extra == 'gis'
139
+ Requires-Dist: networkx>=3.3; extra == 'gis'
140
+ Requires-Dist: pint>=0.24.3; extra == 'gis'
141
+ Requires-Dist: psycopg2-binary>=2.9.13; extra == 'gis'
142
+ Requires-Dist: pydantic-geojson>=0.3.2; extra == 'gis'
143
+ Requires-Dist: pydap>=3.5.9; extra == 'gis'
144
+ Requires-Dist: pyproj>=3.7.1; extra == 'gis'
145
+ Requires-Dist: pysal>=25.1; extra == 'gis'
146
+ Requires-Dist: rasterio>=1.4.4; extra == 'gis'
147
+ Requires-Dist: rioxarray>=0.19.0; extra == 'gis'
148
+ Requires-Dist: scikit-image>=0.25.2; extra == 'gis'
149
+ Requires-Dist: scipy>=1.15.3; extra == 'gis'
150
+ Requires-Dist: shapely>=2.1.2; extra == 'gis'
151
+ Requires-Dist: xarray>=2025.6.1; extra == 'gis'
152
+ Requires-Dist: zarr>=2.18.3; extra == 'gis'
153
+ Provides-Extra: ml
154
+ Requires-Dist: eli5>=0.15.0; extra == 'ml'
155
+ Requires-Dist: formulaic>=1.2.2; extra == 'ml'
156
+ Requires-Dist: glum>=3.4.1; extra == 'ml'
157
+ Requires-Dist: joblib>=1.6.0; extra == 'ml'
158
+ Requires-Dist: pyod>=3.6.6; extra == 'ml'
159
+ Requires-Dist: readability>=0.3.2; extra == 'ml'
160
+ Requires-Dist: scikit-learn>=1.7.2; extra == 'ml'
161
+ Requires-Dist: seaborn>=0.13.2; extra == 'ml'
162
+ Requires-Dist: skorch>=1.4.0; extra == 'ml'
163
+ Requires-Dist: skrub>=0.10.1; extra == 'ml'
164
+ Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'ml'
165
+ Requires-Dist: xgboost>=3.2.0; extra == 'ml'
166
+ Requires-Dist: yellowbrick2>=2.0.2; extra == 'ml'
167
+ Provides-Extra: net
168
+ Requires-Dist: aiobotocore>=3.9.1; extra == 'net'
169
+ Requires-Dist: aiofile>=3.9.0; extra == 'net'
170
+ Requires-Dist: aiofiles>=25.1.0; extra == 'net'
171
+ Requires-Dist: aiometer>=1.0.0; extra == 'net'
172
+ Requires-Dist: aiopath>=0.6.11; extra == 'net'
173
+ Requires-Dist: anyio>=3.7.1; extra == 'net'
174
+ Requires-Dist: boto3>=1.43.75; extra == 'net'
175
+ Requires-Dist: botocore>=1.43.75; extra == 'net'
176
+ Requires-Dist: celery>=5.6.3; extra == 'net'
177
+ Requires-Dist: cryptography>=50.0.1; extra == 'net'
178
+ Requires-Dist: dask>=2026.8.0; extra == 'net'
179
+ Requires-Dist: distributed>=2026.8.0; extra == 'net'
180
+ Requires-Dist: fastapi>=0.141.1; extra == 'net'
181
+ Requires-Dist: ftputil>=5.2.0; extra == 'net'
182
+ Requires-Dist: httpx>=0.27.2; extra == 'net'
183
+ Requires-Dist: locust>=2.46.0; extra == 'net'
184
+ Requires-Dist: networkx>=3.3; extra == 'net'
185
+ Requires-Dist: pandas[aws,fss]>=2.3.3; extra == 'net'
186
+ Requires-Dist: passlib>=1.7.4; extra == 'net'
187
+ Requires-Dist: pathos>=0.3.5; extra == 'net'
188
+ Requires-Dist: polars[async,fsspec]>=1.44.2; extra == 'net'
189
+ Requires-Dist: psutil>=7.2.2; extra == 'net'
190
+ Requires-Dist: pyshark>=0.6; extra == 'net'
191
+ Requires-Dist: pytest-repeat>=0.9.4; extra == 'net'
192
+ Requires-Dist: pyzmq>=27.2.0; extra == 'net'
193
+ Requires-Dist: redis>=8.1.0; extra == 'net'
194
+ Requires-Dist: s3fs>=2026.6.0; extra == 'net'
195
+ Requires-Dist: textfsm>=2.1.0; extra == 'net'
196
+ Requires-Dist: unsync>=1.4.0; extra == 'net'
197
+ Requires-Dist: uvicorn>=0.54.0; extra == 'net'
198
+ Provides-Extra: scieng
199
+ Requires-Dist: altair>=6.2.2; extra == 'scieng'
200
+ Requires-Dist: bokeh>=3.9.2; extra == 'scieng'
201
+ Requires-Dist: bottleneck>=1.6.0; extra == 'scieng'
202
+ Requires-Dist: connectorx>=0.4.6; extra == 'scieng'
203
+ Requires-Dist: dask-image>=2026.5.0; extra == 'scieng'
204
+ Requires-Dist: dask>=2026.8.0; extra == 'scieng'
205
+ Requires-Dist: distributed>=2026.8.0; extra == 'scieng'
206
+ Requires-Dist: duckdb>=1.5.5; extra == 'scieng'
207
+ Requires-Dist: fastexcel>=0.21.0; extra == 'scieng'
208
+ Requires-Dist: formulaic>=1.2.2; extra == 'scieng'
209
+ Requires-Dist: glum>=3.4.1; extra == 'scieng'
210
+ Requires-Dist: graphviz>=0.21; extra == 'scieng'
211
+ Requires-Dist: h5py>=3.16.0; extra == 'scieng'
212
+ Requires-Dist: holoviews>=1.23.2; extra == 'scieng'
213
+ Requires-Dist: hvplot>=0.12.2; extra == 'scieng'
214
+ Requires-Dist: matplotlib>=3.10.9; extra == 'scieng'
215
+ Requires-Dist: networkx>=3.3; extra == 'scieng'
216
+ Requires-Dist: numba>=0.62.1; extra == 'scieng'
217
+ Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3; extra == 'scieng'
218
+ Requires-Dist: pint>=0.24.3; extra == 'scieng'
219
+ Requires-Dist: pooch>=1.9.0; extra == 'scieng'
220
+ Requires-Dist: pyod>=3.6.6; extra == 'scieng'
221
+ Requires-Dist: scikit-image>=0.25.2; extra == 'scieng'
222
+ Requires-Dist: scipy>=1.15.3; extra == 'scieng'
223
+ Requires-Dist: seaborn>=0.13.2; extra == 'scieng'
224
+ Requires-Dist: statsmodels>=0.15.0; extra == 'scieng'
225
+ Requires-Dist: streamlit>=1.56.0; extra == 'scieng'
226
+ Requires-Dist: sympy>=1.14.0; extra == 'scieng'
227
+ Requires-Dist: tables>=3.10.1; extra == 'scieng'
228
+ Requires-Dist: zarr>=2.18.3; extra == 'scieng'
229
+ Provides-Extra: testing
230
+ Requires-Dist: bandit>=1.9.4; extra == 'testing'
231
+ Requires-Dist: black>=26.5.1; extra == 'testing'
232
+ Requires-Dist: dodgy>=0.2.1; extra == 'testing'
233
+ Requires-Dist: flake8-async>=26.8.1; extra == 'testing'
234
+ Requires-Dist: flake8-import-order>=0.19.2; extra == 'testing'
235
+ Requires-Dist: flake8>=7.4.1; extra == 'testing'
236
+ Requires-Dist: gprof2dot>=2025.4.14; extra == 'testing'
237
+ Requires-Dist: hypothesis>=6.168.1; extra == 'testing'
238
+ Requires-Dist: isort>=9.0.1; extra == 'testing'
239
+ Requires-Dist: line-profiler>=5.0.2; extra == 'testing'
240
+ Requires-Dist: memory-profiler>=0.61.0; extra == 'testing'
241
+ Requires-Dist: mkdocs>=1.6.1; extra == 'testing'
242
+ Requires-Dist: py-spy>=0.4.2; extra == 'testing'
243
+ Requires-Dist: pycodestyle>=2.15.0; extra == 'testing'
244
+ Requires-Dist: pyinstrument>=5.1.3; extra == 'testing'
245
+ Requires-Dist: pylint>=4.0.9; extra == 'testing'
246
+ Requires-Dist: pyt>=1.4.0; extra == 'testing'
247
+ Requires-Dist: pytest-cov>=7.1.0; extra == 'testing'
248
+ Requires-Dist: pytest-repeat>=0.9.4; extra == 'testing'
249
+ Requires-Dist: pytest-xdist>=3.8.0; extra == 'testing'
250
+ Requires-Dist: pytest>=9.1.1; extra == 'testing'
251
+ Requires-Dist: scalene>=2.3.0; extra == 'testing'
252
+ Requires-Dist: snakeviz>=2.2.2; extra == 'testing'
253
+ Requires-Dist: sphinx>=8.1.3; extra == 'testing'
254
+ Provides-Extra: web
255
+ Requires-Dist: alembic>=1.20.0; extra == 'web'
256
+ Requires-Dist: beautifulsoup4>=4.15.0; extra == 'web'
257
+ Requires-Dist: cryptography>=50.0.1; extra == 'web'
258
+ Requires-Dist: django>=5.2.17; extra == 'web'
259
+ Requires-Dist: fastapi>=0.141.1; extra == 'web'
260
+ Requires-Dist: flask>=3.1.3; extra == 'web'
261
+ Requires-Dist: httpx>=0.27.2; extra == 'web'
262
+ Requires-Dist: jinja2>=3.1.6; extra == 'web'
263
+ Requires-Dist: passlib>=1.7.4; extra == 'web'
264
+ Requires-Dist: scrapy>=2.19.0; extra == 'web'
265
+ Description-Content-Type: text/markdown
266
+
267
+ # Python Charmers meta-package
268
+
269
+ This is a meta-package for [Python Charmers](https://pythoncharmers.com)
270
+ training participants. This depends on many packages used in Python Charmers
271
+ training courses.
272
+
273
+ This package is intended to be used from a Python Charmers Hub in the cloud
274
+ like https://cpuhub.pythoncharmers.com.
275
+
276
+ ## Installation
277
+
278
+ Install it like this:
279
+
280
+ ```
281
+ pip install pythoncharmers-meta
282
+ ```
283
+
284
+ or, if you have [uv](https://docs.astral.sh/uv/), this will be much faster:
285
+
286
+ ```
287
+ uv pip install pythoncharmers-meta
288
+ ```
289
+
290
+ ## Optional packages (extras)
291
+
292
+ Widget support (`ipywidgets` and its Jupyter browser extensions) is managed by
293
+ the notebook image, not this package or its extras. The `docs` extra uses
294
+ `jupyter-core` rather than the `jupyter` umbrella package so it does not pull
295
+ widgets back in. On a standalone installation, install `ipywidgets` separately
296
+ before starting Jupyter if your notebooks use widgets.
297
+
298
+ The following sets of optional packages ("extras") are available:
299
+
300
+ - `analytics`: data analytics
301
+ - `db`: packages for interfacing with various databases
302
+ - `gis`: geospatial analysis
303
+ - `ml`: "classical" machine learning
304
+ - `dl`: deep learning (a strict superset of [ml])
305
+ - `net`: network engineering, concurrency
306
+ - `scieng`: scientific and engineering computing
307
+ - `testing`: testing, linting, doc generation
308
+ - `web`: web dev
309
+
310
+ This extra helps with building course notes:
311
+
312
+ - `docs`
313
+
314
+ You can add them like this:
315
+
316
+ ```
317
+ uv pip install "pythoncharmers-meta[gis, ml]"
318
+ ```
319
+
320
+ ## Cutting a new release
321
+
322
+ ```
323
+ uv build
324
+ uvx twine upload dist/*
325
+ ```
@@ -23,6 +23,12 @@ uv pip install pythoncharmers-meta
23
23
 
24
24
  ## Optional packages (extras)
25
25
 
26
+ Widget support (`ipywidgets` and its Jupyter browser extensions) is managed by
27
+ the notebook image, not this package or its extras. The `docs` extra uses
28
+ `jupyter-core` rather than the `jupyter` umbrella package so it does not pull
29
+ widgets back in. On a standalone installation, install `ipywidgets` separately
30
+ before starting Jupyter if your notebooks use widgets.
31
+
26
32
  The following sets of optional packages ("extras") are available:
27
33
 
28
34
  - `analytics`: data analytics
@@ -42,7 +48,7 @@ This extra helps with building course notes:
42
48
  You can add them like this:
43
49
 
44
50
  ```
45
- uv pip install "pythoncharmers-meta[gis, ml]" --reinstall
51
+ uv pip install "pythoncharmers-meta[gis, ml]"
46
52
  ```
47
53
 
48
54
  ## Cutting a new release
@@ -0,0 +1,300 @@
1
+ [project]
2
+ name = "pythoncharmers-meta"
3
+ version = "0.8.2"
4
+ description = "Meta package with dependencies for Python Charmers training courses"
5
+ readme = "README.md"
6
+ requires-python = ">=3.10"
7
+ dependencies = [
8
+ "black>=26.5.1",
9
+ "diskcache>=5.6.3",
10
+ "humanize>=4.16.0",
11
+ "hvplot>=0.12.2",
12
+ "ipython>=8.39.0",
13
+ "isort>=9.0.1",
14
+ "keyring>=25.7.0",
15
+ "keyrings-cryptfile>=1.3.9",
16
+ "llm>=0.32.1",
17
+ "loguru>=0.7.2",
18
+ "logzero>=1.7.0",
19
+ "lxml>=6.1.3",
20
+ "matplotlib>=3.10.9",
21
+ "more-itertools>=11.1.0",
22
+ "mypy>=2.3.1",
23
+ "natural>=0.2.0",
24
+ "nbformat>=5.11.1",
25
+ "numba>=0.62.1",
26
+ "numexpr>=2.14.1",
27
+ # "numpy<2.3.0",
28
+ "numpy>=2.2.0",
29
+ "openpyxl>=3.1.5",
30
+ "pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,xml]>=2.3.3",
31
+ "parse>=1.22.2",
32
+ "plotly>=7.1.0,!=6.0.*",
33
+ "polars[excel,graph,numpy,plot,pyarrow,pydantic,style,timezone]>=1.44.2",
34
+ "psutil>=7.2.2",
35
+ "pydantic>=2.13.5",
36
+ "pytest>=9.1.1",
37
+ "requests>=2.34.2",
38
+ "rich>=15.0.0",
39
+ "ruff>=0.16.9",
40
+ "schedule>=1.2.2",
41
+ # "sqlalchemy>=2.0.35",
42
+ "streamlit>=1.56.0",
43
+ "toolz>=1.1.0",
44
+ "tqdm>=4.70.1",
45
+ "ty>=0.0.84",
46
+ "typer>=0.27.2",
47
+ "zstandard>=0.25.0"
48
+ ]
49
+
50
+ [project.optional-dependencies]
51
+ gis = [
52
+ "cartopy>=0.25.0",
53
+ "cftime>=1.6.5",
54
+ "contextily>=1.7.1",
55
+ "dask-image>=2026.5.0",
56
+ "datashader>=0.19.1",
57
+ "descartes>=1.1.0",
58
+ "fiona>=1.10.0",
59
+ "folium>=0.20.0",
60
+ "geoalchemy>=0.7.2",
61
+ "geopandas>=1.1.4",
62
+ "geopy>=2.5.0",
63
+ "graphviz>=0.21",
64
+ "h5netcdf>=1.8.1",
65
+ "iris>=1.0.7",
66
+ "netcdf4>=1.7.3",
67
+ "networkx>=3.3",
68
+ "pint>=0.24.3",
69
+ "psycopg2-binary>=2.9.13",
70
+ "pydantic-geojson>=0.3.2",
71
+ "pydap>=3.5.9",
72
+ "pyproj>=3.7.1",
73
+ "pysal>=25.1",
74
+ "rasterio>=1.4.4",
75
+ "rioxarray>=0.19.0",
76
+ "scikit-image>=0.25.2",
77
+ "scipy>=1.15.3",
78
+ "shapely>=2.1.2",
79
+ "xarray>=2025.6.1",
80
+ "zarr>=2.18.3",
81
+ ]
82
+ ml = [
83
+ "eli5>=0.15.0",
84
+ "formulaic>=1.2.2",
85
+ "glum>=3.4.1",
86
+ "joblib>=1.6.0",
87
+ "pyod>=3.6.6",
88
+ "readability>=0.3.2",
89
+ "scikit-learn>=1.7.2",
90
+ "seaborn>=0.13.2",
91
+ "skorch>=1.4.0",
92
+ "skrub>=0.10.1",
93
+ "textdistance[Levenshtein]>=4.6.3",
94
+ "xgboost>=3.2.0",
95
+ "yellowbrick2 >=2.0.2"
96
+ ]
97
+ web = [
98
+ "alembic>=1.20.0",
99
+ "beautifulsoup4>=4.15.0",
100
+ "cryptography>=50.0.1",
101
+ "django>=5.2.17",
102
+ "fastapi>=0.141.1",
103
+ "flask>=3.1.3",
104
+ "httpx>=0.27.2",
105
+ "jinja2>=3.1.6",
106
+ "passlib>=1.7.4",
107
+ "scrapy>=2.19.0",
108
+ # "sqlalchemy>=2.0.35",
109
+ ]
110
+ analytics = [
111
+ "altair>=6.2.2",
112
+ "bokeh>=3.9.2",
113
+ "bottleneck>=1.6.0",
114
+ "connectorx>=0.4.6",
115
+ "darts[notorch]>=0.46.0",
116
+ "dask>=2026.8.0",
117
+ "distributed>=2026.8.0",
118
+ "duckdb>=1.5.5",
119
+ "fastexcel>=0.21.0",
120
+ "formulaic>=1.2.2",
121
+ "glum>=3.4.1",
122
+ "graphviz>=0.21",
123
+ "holoviews>=1.23.2",
124
+ "hvplot>=0.12.2",
125
+ "ibis-framework[duckdb,polars,sqlite]>=12.0.0",
126
+ "matplotlib>=3.10.9",
127
+ "networkx>=3.3",
128
+ "numba>=0.62.1",
129
+ "pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3",
130
+ "pandera[mypy,pandas,polars]>=0.33.1",
131
+ "pyod>=3.6.6",
132
+ "scikit-learn>=1.7.2",
133
+ "scipy>=1.15.3",
134
+ "seaborn>=0.13.2",
135
+ "statsmodels>=0.15.0",
136
+ "streamlit>=1.56.0",
137
+ "tables>=3.10.1",
138
+ "textblob>=0.20.1",
139
+ "textdistance[Levenshtein]>=4.6.3",
140
+ # "sqlalchemy[asyncio]>=2.0.35",
141
+ ]
142
+ scieng = [
143
+ "altair>=6.2.2",
144
+ "bokeh>=3.9.2",
145
+ "bottleneck>=1.6.0",
146
+ "connectorx>=0.4.6",
147
+ "dask-image>=2026.5.0",
148
+ "dask>=2026.8.0",
149
+ "distributed>=2026.8.0",
150
+ "duckdb>=1.5.5",
151
+ "fastexcel>=0.21.0",
152
+ "formulaic>=1.2.2",
153
+ "glum>=3.4.1",
154
+ "graphviz>=0.21",
155
+ "h5py>=3.16.0",
156
+ "holoviews>=1.23.2",
157
+ "hvplot>=0.12.2",
158
+ "matplotlib>=3.10.9",
159
+ "networkx>=3.3",
160
+ "numba>=0.62.1",
161
+ "pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3",
162
+ "pint>=0.24.3",
163
+ "pooch>=1.9.0",
164
+ "pyod>=3.6.6",
165
+ "scikit-image>=0.25.2",
166
+ "scipy>=1.15.3",
167
+ "seaborn>=0.13.2",
168
+ "statsmodels>=0.15.0",
169
+ "streamlit>=1.56.0",
170
+ "sympy>=1.14.0",
171
+ "tables>=3.10.1",
172
+ "zarr>=2.18.3",
173
+ ]
174
+ net = [
175
+ "aiobotocore>=3.9.1",
176
+ "aiofile>=3.9.0",
177
+ "aiofiles>=25.1.0",
178
+ "aiometer>=1.0.0",
179
+ "aiopath>=0.6.11",
180
+ "anyio>=3.7.1",
181
+ "boto3>=1.43.75",
182
+ "botocore>=1.43.75",
183
+ "celery>=5.6.3",
184
+ "cryptography>=50.0.1",
185
+ "dask>=2026.8.0",
186
+ "distributed>=2026.8.0",
187
+ "fastapi>=0.141.1",
188
+ "ftputil>=5.2.0",
189
+ "httpx>=0.27.2",
190
+ "locust>=2.46.0",
191
+ "networkx>=3.3",
192
+ "pandas[aws,fss]>=2.3.3",
193
+ "passlib>=1.7.4",
194
+ "pathos>=0.3.5",
195
+ "polars[async,fsspec]>=1.44.2",
196
+ "psutil>=7.2.2",
197
+ "pyshark>=0.6",
198
+ "pytest-repeat>=0.9.4",
199
+ "pyzmq>=27.2.0",
200
+ "redis>=8.1.0",
201
+ "s3fs>=2026.6.0",
202
+ "textfsm>=2.1.0",
203
+ "unsync>=1.4.0",
204
+ "uvicorn>=0.54.0",
205
+ ]
206
+ dl = [
207
+ "albumentations>=2.0.8",
208
+ "darts[torch]>=0.46.0",
209
+ "dataset>=2.0.0",
210
+ "datasets>=5.0.1",
211
+ "diskcache>=5.6.3",
212
+ "eli5>=0.15.0",
213
+ "evaluate>=0.4.6",
214
+ "joblib>=1.6.0",
215
+ "lightning>=2.6.6",
216
+ "prophet>=1.4.0",
217
+ "pyod>=3.6.6",
218
+ "scikit-learn>=1.7.2",
219
+ "skorch>=1.4.0",
220
+ "skrub>=0.10.1",
221
+ "tensorboard>=2.21.0",
222
+ "textdistance[Levenshtein]>=4.6.3",
223
+ "torch>=2.2.2",
224
+ "torchaudio>=2.2.2",
225
+ "torchvision>=0.17.2",
226
+ "transformers[torch]>=5.0.0",
227
+ "xgboost>=3.2.0",
228
+ "yellowbrick2 >=2.0.2"
229
+ ]
230
+ testing = [
231
+ "bandit>=1.9.4",
232
+ "black>=26.5.1",
233
+ "dodgy>=0.2.1",
234
+ "flake8-async>=26.8.1",
235
+ "flake8-import-order>=0.19.2",
236
+ "flake8>=7.4.1",
237
+ "gprof2dot>=2025.4.14",
238
+ "hypothesis>=6.168.1",
239
+ "isort>=9.0.1",
240
+ "line-profiler>=5.0.2",
241
+ "memory-profiler>=0.61.0",
242
+ "mkdocs>=1.6.1",
243
+ "py-spy>=0.4.2",
244
+ "pycodestyle>=2.15.0",
245
+ "pyinstrument>=5.1.3",
246
+ "pylint>=4.0.9",
247
+ "pyt>=1.4.0",
248
+ "pytest-cov>=7.1.0",
249
+ "pytest-repeat>=0.9.4",
250
+ "pytest-xdist>=3.8.0",
251
+ "pytest>=9.1.1",
252
+ "scalene>=2.3.0",
253
+ "snakeviz>=2.2.2",
254
+ "sphinx>=8.1.3",
255
+ ]
256
+ db = [
257
+ "duckdb>=1.5.5",
258
+ "ibis-framework[duckdb,polars,sqlite]>=12.0.0",
259
+ "pandas[sql-other]>=2.3.3",
260
+ "polars[database]>=1.44.2",
261
+ "pyodbc>=5.3.0",
262
+ "redis>=8.1.0",
263
+ "sqlalchemy>=2.0.54",
264
+ ]
265
+ bio = [
266
+ "anndata>=0.11.4",
267
+ "biopython>=1.88",
268
+ "igraph>=1.0.0",
269
+ "leidenalg>=0.12.0",
270
+ "paramiko>=5.0.0",
271
+ "pooch>=1.9.0",
272
+ "scanpy>=1.11.5",
273
+ "scikit-image>=0.25.2",
274
+ "scikit-misc>=0.5.2",
275
+ "tqdm>=4.70.1",
276
+ ]
277
+ # The 'docs' extra includes support for building course notes using Quarto:
278
+ docs = [
279
+ "nbclient>=0.11.0",
280
+ # The notebook image manages widget/browser packages. The jupyter umbrella
281
+ # would pull ipywidgets back in; docs only needs the command infrastructure.
282
+ "jupyter-core",
283
+ "jupyter-cache",
284
+ "black>=26.5.1",
285
+ "kaleido>=1.4.0"
286
+ ]
287
+
288
+ [build-system]
289
+ requires = ["hatchling"]
290
+ build-backend = "hatchling.build"
291
+
292
+ [tool.uv]
293
+ # Require Intel Mac wheels for Python 3.10–3.12; PyTorch has no Intel Mac
294
+ # wheels for newer Python versions.
295
+ required-environments = [
296
+ "sys_platform == 'darwin' and platform_machine == 'x86_64' and python_version < '3.13'"
297
+ ]
298
+ constraint-dependencies = [
299
+ "configargparse>=1.7.1",
300
+ ]