Metadata-Version: 2.5
Name: pythoncharmers-meta
Version: 0.8.0
Summary: Meta package with dependencies for Python Charmers training courses
License-File: LICENSE
Requires-Python: >=3.10
Requires-Dist: black>=26.5.1
Requires-Dist: diskcache>=5.6.3
Requires-Dist: humanize>=4.16.0
Requires-Dist: hvplot>=0.12.2
Requires-Dist: ipython>=8.39.0
Requires-Dist: ipywidgets>=8.1.9
Requires-Dist: isort>=9.0.1
Requires-Dist: keyring>=25.7.0
Requires-Dist: keyrings-cryptfile>=1.3.9
Requires-Dist: llm>=0.32.1
Requires-Dist: loguru>=0.7.2
Requires-Dist: logzero>=1.7.0
Requires-Dist: lxml>=6.1.3
Requires-Dist: matplotlib>=3.10.9
Requires-Dist: more-itertools>=11.1.0
Requires-Dist: mypy>=2.3.1
Requires-Dist: natural>=0.2.0
Requires-Dist: nbformat>=5.11.1
Requires-Dist: numba>=0.62.1
Requires-Dist: numexpr>=2.14.1
Requires-Dist: numpy>=2.2.0
Requires-Dist: openpyxl>=3.1.5
Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,xml]>=2.3.3
Requires-Dist: parse>=1.22.2
Requires-Dist: plotly!=6.0.*,>=7.1.0
Requires-Dist: polars[excel,graph,numpy,plot,pyarrow,pydantic,style,timezone]>=1.44.2
Requires-Dist: psutil>=7.2.2
Requires-Dist: pydantic>=2.13.5
Requires-Dist: pytest>=9.1.1
Requires-Dist: requests>=2.34.2
Requires-Dist: rich>=15.0.0
Requires-Dist: ruff>=0.16.9
Requires-Dist: schedule>=1.2.2
Requires-Dist: streamlit>=1.56.0
Requires-Dist: toolz>=1.1.0
Requires-Dist: tqdm>=4.70.1
Requires-Dist: ty>=0.0.84
Requires-Dist: typer>=0.27.2
Requires-Dist: zstandard>=0.25.0
Provides-Extra: analytics
Requires-Dist: altair>=6.2.2; extra == 'analytics'
Requires-Dist: bokeh>=3.9.2; extra == 'analytics'
Requires-Dist: bottleneck>=1.6.0; extra == 'analytics'
Requires-Dist: connectorx>=0.4.6; extra == 'analytics'
Requires-Dist: darts[notorch]>=0.46.0; extra == 'analytics'
Requires-Dist: dask>=2026.8.0; extra == 'analytics'
Requires-Dist: distributed>=2026.8.0; extra == 'analytics'
Requires-Dist: duckdb>=1.5.5; extra == 'analytics'
Requires-Dist: fastexcel>=0.21.0; extra == 'analytics'
Requires-Dist: formulaic>=1.2.2; extra == 'analytics'
Requires-Dist: glum>=3.4.1; extra == 'analytics'
Requires-Dist: graphviz>=0.21; extra == 'analytics'
Requires-Dist: holoviews>=1.23.2; extra == 'analytics'
Requires-Dist: hvplot>=0.12.2; extra == 'analytics'
Requires-Dist: ibis-framework[duckdb,polars,sqlite]>=12.0.0; extra == 'analytics'
Requires-Dist: matplotlib>=3.10.9; extra == 'analytics'
Requires-Dist: networkx>=3.3; extra == 'analytics'
Requires-Dist: numba>=0.62.1; extra == 'analytics'
Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3; extra == 'analytics'
Requires-Dist: pandera[mypy,pandas,polars]>=0.33.1; extra == 'analytics'
Requires-Dist: pyod>=3.6.6; extra == 'analytics'
Requires-Dist: scikit-learn>=1.7.2; extra == 'analytics'
Requires-Dist: scipy>=1.15.3; extra == 'analytics'
Requires-Dist: seaborn>=0.13.2; extra == 'analytics'
Requires-Dist: statsmodels>=0.15.0; extra == 'analytics'
Requires-Dist: streamlit>=1.56.0; extra == 'analytics'
Requires-Dist: tables>=3.10.1; extra == 'analytics'
Requires-Dist: textblob>=0.20.1; extra == 'analytics'
Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'analytics'
Provides-Extra: bio
Requires-Dist: anndata>=0.11.4; extra == 'bio'
Requires-Dist: biopython>=1.88; extra == 'bio'
Requires-Dist: igraph>=1.0.0; extra == 'bio'
Requires-Dist: leidenalg>=0.12.0; extra == 'bio'
Requires-Dist: paramiko>=5.0.0; extra == 'bio'
Requires-Dist: pooch>=1.9.0; extra == 'bio'
Requires-Dist: scanpy>=1.11.5; extra == 'bio'
Requires-Dist: scikit-image>=0.25.2; extra == 'bio'
Requires-Dist: scikit-misc>=0.5.2; extra == 'bio'
Requires-Dist: tqdm>=4.70.1; extra == 'bio'
Provides-Extra: db
Requires-Dist: duckdb>=1.5.5; extra == 'db'
Requires-Dist: ibis-framework[duckdb,polars,sqlite]>=12.0.0; extra == 'db'
Requires-Dist: pandas[sql-other]>=2.3.3; extra == 'db'
Requires-Dist: polars[database]>=1.44.2; extra == 'db'
Requires-Dist: pyodbc>=5.3.0; extra == 'db'
Requires-Dist: redis>=8.1.0; extra == 'db'
Requires-Dist: sqlalchemy>=2.0.54; extra == 'db'
Provides-Extra: dl
Requires-Dist: albumentations>=2.0.8; extra == 'dl'
Requires-Dist: darts[torch]>=0.46.0; extra == 'dl'
Requires-Dist: dataset>=2.0.0; extra == 'dl'
Requires-Dist: datasets>=5.0.1; extra == 'dl'
Requires-Dist: diskcache>=5.6.3; extra == 'dl'
Requires-Dist: eli5>=0.15.0; extra == 'dl'
Requires-Dist: evaluate>=0.4.6; extra == 'dl'
Requires-Dist: joblib>=1.6.0; extra == 'dl'
Requires-Dist: lightning>=2.6.6; extra == 'dl'
Requires-Dist: prophet>=1.4.0; extra == 'dl'
Requires-Dist: pyod>=3.6.6; extra == 'dl'
Requires-Dist: scikit-learn>=1.7.2; extra == 'dl'
Requires-Dist: skorch>=1.4.0; extra == 'dl'
Requires-Dist: skrub>=0.10.1; extra == 'dl'
Requires-Dist: tensorboard>=2.21.0; extra == 'dl'
Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'dl'
Requires-Dist: torch>=2.2.2; extra == 'dl'
Requires-Dist: torchaudio>=2.2.2; extra == 'dl'
Requires-Dist: torchvision>=0.17.2; extra == 'dl'
Requires-Dist: transformers[torch]>=5.0.0; extra == 'dl'
Requires-Dist: xgboost>=3.2.0; extra == 'dl'
Requires-Dist: yellowbrick2>=2.0.2; extra == 'dl'
Provides-Extra: docs
Requires-Dist: black>=26.5.1; extra == 'docs'
Requires-Dist: jupyter; extra == 'docs'
Requires-Dist: jupyter-cache; extra == 'docs'
Requires-Dist: kaleido>=1.4.0; extra == 'docs'
Requires-Dist: nbclient>=0.11.0; extra == 'docs'
Provides-Extra: gis
Requires-Dist: cartopy>=0.25.0; extra == 'gis'
Requires-Dist: cftime>=1.6.5; extra == 'gis'
Requires-Dist: contextily>=1.7.1; extra == 'gis'
Requires-Dist: dask-image>=2026.5.0; extra == 'gis'
Requires-Dist: datashader>=0.19.1; extra == 'gis'
Requires-Dist: descartes>=1.1.0; extra == 'gis'
Requires-Dist: fiona>=1.10.0; extra == 'gis'
Requires-Dist: folium>=0.20.0; extra == 'gis'
Requires-Dist: geoalchemy>=0.7.2; extra == 'gis'
Requires-Dist: geopandas>=1.1.4; extra == 'gis'
Requires-Dist: geopy>=2.5.0; extra == 'gis'
Requires-Dist: graphviz>=0.21; extra == 'gis'
Requires-Dist: h5netcdf>=1.8.1; extra == 'gis'
Requires-Dist: iris>=1.0.7; extra == 'gis'
Requires-Dist: netcdf4>=1.7.3; extra == 'gis'
Requires-Dist: networkx>=3.3; extra == 'gis'
Requires-Dist: pint>=0.24.3; extra == 'gis'
Requires-Dist: psycopg2-binary>=2.9.13; extra == 'gis'
Requires-Dist: pydantic-geojson>=0.3.2; extra == 'gis'
Requires-Dist: pydap>=3.5.9; extra == 'gis'
Requires-Dist: pyproj>=3.7.1; extra == 'gis'
Requires-Dist: pysal>=25.1; extra == 'gis'
Requires-Dist: rasterio>=1.4.4; extra == 'gis'
Requires-Dist: rioxarray>=0.19.0; extra == 'gis'
Requires-Dist: scikit-image>=0.25.2; extra == 'gis'
Requires-Dist: scipy>=1.15.3; extra == 'gis'
Requires-Dist: shapely>=2.1.2; extra == 'gis'
Requires-Dist: xarray>=2025.6.1; extra == 'gis'
Requires-Dist: zarr>=2.18.3; extra == 'gis'
Provides-Extra: ml
Requires-Dist: eli5>=0.15.0; extra == 'ml'
Requires-Dist: formulaic>=1.2.2; extra == 'ml'
Requires-Dist: glum>=3.4.1; extra == 'ml'
Requires-Dist: joblib>=1.6.0; extra == 'ml'
Requires-Dist: pyod>=3.6.6; extra == 'ml'
Requires-Dist: readability>=0.3.2; extra == 'ml'
Requires-Dist: scikit-learn>=1.7.2; extra == 'ml'
Requires-Dist: seaborn>=0.13.2; extra == 'ml'
Requires-Dist: skorch>=1.4.0; extra == 'ml'
Requires-Dist: skrub>=0.10.1; extra == 'ml'
Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'ml'
Requires-Dist: xgboost>=3.2.0; extra == 'ml'
Requires-Dist: yellowbrick2>=2.0.2; extra == 'ml'
Provides-Extra: net
Requires-Dist: aiobotocore>=3.9.1; extra == 'net'
Requires-Dist: aiofile>=3.9.0; extra == 'net'
Requires-Dist: aiofiles>=25.1.0; extra == 'net'
Requires-Dist: aiometer>=1.0.0; extra == 'net'
Requires-Dist: aiopath>=0.6.11; extra == 'net'
Requires-Dist: anyio>=3.7.1; extra == 'net'
Requires-Dist: boto3>=1.43.75; extra == 'net'
Requires-Dist: botocore>=1.43.75; extra == 'net'
Requires-Dist: celery>=5.6.3; extra == 'net'
Requires-Dist: cryptography>=50.0.1; extra == 'net'
Requires-Dist: dask>=2026.8.0; extra == 'net'
Requires-Dist: distributed>=2026.8.0; extra == 'net'
Requires-Dist: fastapi>=0.141.1; extra == 'net'
Requires-Dist: ftputil>=5.2.0; extra == 'net'
Requires-Dist: httpx>=0.27.2; extra == 'net'
Requires-Dist: locust>=2.46.0; extra == 'net'
Requires-Dist: networkx>=3.3; extra == 'net'
Requires-Dist: pandas[aws,fss]>=2.3.3; extra == 'net'
Requires-Dist: passlib>=1.7.4; extra == 'net'
Requires-Dist: pathos>=0.3.5; extra == 'net'
Requires-Dist: polars[async,fsspec]>=1.44.2; extra == 'net'
Requires-Dist: psutil>=7.2.2; extra == 'net'
Requires-Dist: pyshark>=0.6; extra == 'net'
Requires-Dist: pytest-repeat>=0.9.4; extra == 'net'
Requires-Dist: pyzmq>=27.2.0; extra == 'net'
Requires-Dist: redis>=8.1.0; extra == 'net'
Requires-Dist: s3fs>=2026.6.0; extra == 'net'
Requires-Dist: textfsm>=2.1.0; extra == 'net'
Requires-Dist: unsync>=1.4.0; extra == 'net'
Requires-Dist: uvicorn>=0.54.0; extra == 'net'
Provides-Extra: scieng
Requires-Dist: altair>=6.2.2; extra == 'scieng'
Requires-Dist: bokeh>=3.9.2; extra == 'scieng'
Requires-Dist: bottleneck>=1.6.0; extra == 'scieng'
Requires-Dist: connectorx>=0.4.6; extra == 'scieng'
Requires-Dist: dask-image>=2026.5.0; extra == 'scieng'
Requires-Dist: dask>=2026.8.0; extra == 'scieng'
Requires-Dist: distributed>=2026.8.0; extra == 'scieng'
Requires-Dist: duckdb>=1.5.5; extra == 'scieng'
Requires-Dist: fastexcel>=0.21.0; extra == 'scieng'
Requires-Dist: formulaic>=1.2.2; extra == 'scieng'
Requires-Dist: glum>=3.4.1; extra == 'scieng'
Requires-Dist: graphviz>=0.21; extra == 'scieng'
Requires-Dist: h5py>=3.16.0; extra == 'scieng'
Requires-Dist: holoviews>=1.23.2; extra == 'scieng'
Requires-Dist: hvplot>=0.12.2; extra == 'scieng'
Requires-Dist: matplotlib>=3.10.9; extra == 'scieng'
Requires-Dist: networkx>=3.3; extra == 'scieng'
Requires-Dist: numba>=0.62.1; extra == 'scieng'
Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3; extra == 'scieng'
Requires-Dist: pint>=0.24.3; extra == 'scieng'
Requires-Dist: pooch>=1.9.0; extra == 'scieng'
Requires-Dist: pyod>=3.6.6; extra == 'scieng'
Requires-Dist: scikit-image>=0.25.2; extra == 'scieng'
Requires-Dist: scipy>=1.15.3; extra == 'scieng'
Requires-Dist: seaborn>=0.13.2; extra == 'scieng'
Requires-Dist: statsmodels>=0.15.0; extra == 'scieng'
Requires-Dist: streamlit>=1.56.0; extra == 'scieng'
Requires-Dist: sympy>=1.14.0; extra == 'scieng'
Requires-Dist: tables>=3.10.1; extra == 'scieng'
Requires-Dist: zarr>=2.18.3; extra == 'scieng'
Provides-Extra: testing
Requires-Dist: bandit>=1.9.4; extra == 'testing'
Requires-Dist: black>=26.5.1; extra == 'testing'
Requires-Dist: dodgy>=0.2.1; extra == 'testing'
Requires-Dist: flake8-async>=26.8.1; extra == 'testing'
Requires-Dist: flake8-import-order>=0.19.2; extra == 'testing'
Requires-Dist: flake8>=7.4.1; extra == 'testing'
Requires-Dist: gprof2dot>=2025.4.14; extra == 'testing'
Requires-Dist: hypothesis>=6.168.1; extra == 'testing'
Requires-Dist: isort>=9.0.1; extra == 'testing'
Requires-Dist: line-profiler>=5.0.2; extra == 'testing'
Requires-Dist: memory-profiler>=0.61.0; extra == 'testing'
Requires-Dist: mkdocs>=1.6.1; extra == 'testing'
Requires-Dist: py-spy>=0.4.2; extra == 'testing'
Requires-Dist: pycodestyle>=2.15.0; extra == 'testing'
Requires-Dist: pyinstrument>=5.1.3; extra == 'testing'
Requires-Dist: pylint>=4.0.9; extra == 'testing'
Requires-Dist: pyt>=1.4.0; extra == 'testing'
Requires-Dist: pytest-cov>=7.1.0; extra == 'testing'
Requires-Dist: pytest-repeat>=0.9.4; extra == 'testing'
Requires-Dist: pytest-xdist>=3.8.0; extra == 'testing'
Requires-Dist: pytest>=9.1.1; extra == 'testing'
Requires-Dist: scalene>=2.3.0; extra == 'testing'
Requires-Dist: snakeviz>=2.2.2; extra == 'testing'
Requires-Dist: sphinx>=8.1.3; extra == 'testing'
Provides-Extra: web
Requires-Dist: alembic>=1.20.0; extra == 'web'
Requires-Dist: beautifulsoup4>=4.15.0; extra == 'web'
Requires-Dist: cryptography>=50.0.1; extra == 'web'
Requires-Dist: django>=5.2.17; extra == 'web'
Requires-Dist: fastapi>=0.141.1; extra == 'web'
Requires-Dist: flask>=3.1.3; extra == 'web'
Requires-Dist: httpx>=0.27.2; extra == 'web'
Requires-Dist: jinja2>=3.1.6; extra == 'web'
Requires-Dist: passlib>=1.7.4; extra == 'web'
Requires-Dist: scrapy>=2.19.0; extra == 'web'
Description-Content-Type: text/markdown

# Python Charmers meta-package

This is a meta-package for [Python Charmers](https://pythoncharmers.com)
training participants. This depends on many packages used in Python Charmers
training courses.

This package is intended to be used from a Python Charmers Hub in the cloud
like https://cpuhub.pythoncharmers.com.

## Installation

Install it like this:

```
pip install pythoncharmers-meta
```

or, if you have [uv](https://docs.astral.sh/uv/), this will be much faster:

```
uv pip install pythoncharmers-meta
```

## Optional packages (extras)

The following sets of optional packages ("extras") are available:

- `analytics`: data analytics
- `db`: packages for interfacing with various databases
- `gis`: geospatial analysis
- `ml`: "classical" machine learning
- `dl`: deep learning (a strict superset of [ml])
- `net`: network engineering, concurrency
- `scieng`: scientific and engineering computing
- `testing`: testing, linting, doc generation
- `web`: web dev

This extra helps with building course notes:

- `docs`

You can add them like this:

```
uv pip install "pythoncharmers-meta[gis, ml]" --reinstall
```

## Cutting a new release

```
uv build
uvx twine upload dist/*
```
