Metadata-Version: 2.4
Name: pythoncharmers-meta
Version: 0.7.8
Summary: Meta package with dependencies for Python Charmers training courses
License-File: LICENSE
Requires-Python: >=3.10
Requires-Dist: black>=24.8.0
Requires-Dist: diskcache>=5.6.3
Requires-Dist: humanize>=4.10.0
Requires-Dist: hvplot>=0.10.0
Requires-Dist: ipython>=8.12.3
Requires-Dist: ipywidgets>=8.1.7
Requires-Dist: isort>=5.13.2
Requires-Dist: keyring>=25.4.1
Requires-Dist: keyrings-cryptfile>=1.3.9
Requires-Dist: llm>=0.26
Requires-Dist: loguru>=0.7.2
Requires-Dist: logzero>=1.7.0
Requires-Dist: lxml>=5.3.0
Requires-Dist: matplotlib>=3.9.2
Requires-Dist: more-itertools>=10.6.0
Requires-Dist: mypy>=1.11.2
Requires-Dist: natural>=0.2.0
Requires-Dist: nbformat>=5.10.4
Requires-Dist: numba>=0.61.2
Requires-Dist: numexpr>=2.10.1
Requires-Dist: numpy<2.3.0
Requires-Dist: openpyxl>=3.1.5
Requires-Dist: pandas[aws,compression,computation,consortium-standard,excel,feather,fss,hdf5,html,output-formatting,parquet,plot,xml]>=2.2.3
Requires-Dist: parse>=1.20.2
Requires-Dist: plotly!=6.0.*,>=5.24.0
Requires-Dist: polars[excel,graph,numpy,plot,pyarrow,pydantic,style,timezone]>=1.29.0
Requires-Dist: psutil>=6.0.0
Requires-Dist: pydantic>=2.9.2
Requires-Dist: pytest>=8.3.5
Requires-Dist: requests>=2.32.3
Requires-Dist: rich>=13.9.4
Requires-Dist: ruff>=0.11.1
Requires-Dist: schedule>=1.2.2
Requires-Dist: streamlit>=1.45.0
Requires-Dist: toolz>=0.12.1
Requires-Dist: tqdm>=4.67.1
Provides-Extra: analytics
Requires-Dist: altair>=5.4.1; extra == 'analytics'
Requires-Dist: bokeh>=3.4.3; extra == 'analytics'
Requires-Dist: bottleneck>=1.4.0; extra == 'analytics'
Requires-Dist: connectorx>=0.4.1; extra == 'analytics'
Requires-Dist: dask>=2025.2.0; extra == 'analytics'
Requires-Dist: distributed>=2024.9.1; extra == 'analytics'
Requires-Dist: duckdb>=1.1.3; extra == 'analytics'
Requires-Dist: fastexcel>=0.12.1; extra == 'analytics'
Requires-Dist: formulaic>=1.1.1; extra == 'analytics'
Requires-Dist: glum>=3.1.2; extra == 'analytics'
Requires-Dist: graphviz>=0.20.3; extra == 'analytics'
Requires-Dist: holoviews>=1.19.1; extra == 'analytics'
Requires-Dist: hvplot>=0.10.0; extra == 'analytics'
Requires-Dist: ibis-framework[duckdb,polars,sqlite]>=10.5.0; extra == 'analytics'
Requires-Dist: matplotlib>=3.9.2; extra == 'analytics'
Requires-Dist: networkx>=3.3; extra == 'analytics'
Requires-Dist: numba>=0.61.0; extra == 'analytics'
Requires-Dist: pandas[aws,compression,computation,consortium-standard,excel,feather,fss,hdf5,html,output-formatting,parquet,plot,spss,xml]>=2.2.3; extra == 'analytics'
Requires-Dist: pandera[mypy,pandas,polars]>=0.24.0; extra == 'analytics'
Requires-Dist: pyod>=2.0.5; extra == 'analytics'
Requires-Dist: scikit-learn>=1.6.1; extra == 'analytics'
Requires-Dist: scipy>=1.15.2; extra == 'analytics'
Requires-Dist: seaborn>=0.13.2; extra == 'analytics'
Requires-Dist: statsmodels>=0.14.4; extra == 'analytics'
Requires-Dist: streamlit>=1.45.0; extra == 'analytics'
Requires-Dist: tables>=3.10.1; extra == 'analytics'
Requires-Dist: textblob>=0.19.0; 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.85; extra == 'bio'
Requires-Dist: igraph>=0.11.9; extra == 'bio'
Requires-Dist: leidenalg>=0.10.2; extra == 'bio'
Requires-Dist: paramiko>=3.5.1; extra == 'bio'
Requires-Dist: pooch>=1.8.2; extra == 'bio'
Requires-Dist: scanpy>=1.11.2; extra == 'bio'
Requires-Dist: scikit-image>=0.24.0; extra == 'bio'
Requires-Dist: scikit-misc>=0.5.1; extra == 'bio'
Requires-Dist: tqdm>=4.67.1; extra == 'bio'
Provides-Extra: db
Requires-Dist: duckdb>=1.1.3; extra == 'db'
Requires-Dist: ibis-framework[duckdb,polars,sqlite]>=10.5.0; extra == 'db'
Requires-Dist: pandas[sql-other]>=2.2.3; extra == 'db'
Requires-Dist: polars[database]>=1.29.0; extra == 'db'
Requires-Dist: pyodbc>=5.2.0; extra == 'db'
Requires-Dist: redis>=5.2.1; extra == 'db'
Requires-Dist: sqlalchemy>=2.0.38; extra == 'db'
Provides-Extra: dl
Requires-Dist: albumentations>=2.0.8; extra == 'dl'
Requires-Dist: dataset>=1.5.2; extra == 'dl'
Requires-Dist: datasets>=2.2.1; extra == 'dl'
Requires-Dist: diskcache>=5.6.3; extra == 'dl'
Requires-Dist: eli5>=0.15.0; extra == 'dl'
Requires-Dist: evaluate>=0.4.3; extra == 'dl'
Requires-Dist: joblib>=1.4.2; extra == 'dl'
Requires-Dist: more-itertools>=10.5.0; extra == 'dl'
Requires-Dist: prophet>=1.1.6; extra == 'dl'
Requires-Dist: pyod>=2.0.5; extra == 'dl'
Requires-Dist: scikit-learn>=1.6.1; extra == 'dl'
Requires-Dist: skorch>=1.0.0; extra == 'dl'
Requires-Dist: tensorboard>=2.18.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]>=4.49.0; extra == 'dl'
Requires-Dist: xgboost>=2.1.1; extra == 'dl'
Requires-Dist: yellowbrick>=1.5; extra == 'dl'
Provides-Extra: docs
Requires-Dist: black; extra == 'docs'
Requires-Dist: jupyter; extra == 'docs'
Requires-Dist: jupyter-cache; extra == 'docs'
Requires-Dist: nbclient; extra == 'docs'
Provides-Extra: gis
Requires-Dist: cartopy>=0.23.0; extra == 'gis'
Requires-Dist: cftime>=1.6.4; extra == 'gis'
Requires-Dist: contextily>=1.6.2; extra == 'gis'
Requires-Dist: dask-image>=2024.5.3; extra == 'gis'
Requires-Dist: datashader>=0.16.3; extra == 'gis'
Requires-Dist: descartes>=1.1.0; extra == 'gis'
Requires-Dist: fiona>=1.10.0; extra == 'gis'
Requires-Dist: folium>=0.17.0; extra == 'gis'
Requires-Dist: geoalchemy>=0.7.2; extra == 'gis'
Requires-Dist: geopandas>=1.0.1; extra == 'gis'
Requires-Dist: geopy>=2.4.1; extra == 'gis'
Requires-Dist: graphviz>=0.20.3; extra == 'gis'
Requires-Dist: h5netcdf>=1.3.0; extra == 'gis'
Requires-Dist: iris>=1.0.7; extra == 'gis'
Requires-Dist: netcdf4>=1.7.1.post2; extra == 'gis'
Requires-Dist: networkx>=3.3; extra == 'gis'
Requires-Dist: pint>=0.24.3; extra == 'gis'
Requires-Dist: psycopg2-binary>=2.9.10; extra == 'gis'
Requires-Dist: pydantic-geojson>=0.2.0; extra == 'gis'
Requires-Dist: pydap>=3.5; extra == 'gis'
Requires-Dist: pyproj>=3.6.1; extra == 'gis'
Requires-Dist: pysal>=24.7; extra == 'gis'
Requires-Dist: rasterio>=1.3.11; extra == 'gis'
Requires-Dist: rioxarray>=0.17.0; extra == 'gis'
Requires-Dist: scikit-image>=0.24.0; extra == 'gis'
Requires-Dist: scipy>=1.15; extra == 'gis'
Requires-Dist: shapely>=2.0.6; extra == 'gis'
Requires-Dist: xarray>=2024.9.0; extra == 'gis'
Requires-Dist: zarr>=2.18.3; extra == 'gis'
Provides-Extra: ml
Requires-Dist: eli5>=0.15.0; extra == 'ml'
Requires-Dist: glum>=3.1.2; extra == 'ml'
Requires-Dist: joblib>=1.4.2; extra == 'ml'
Requires-Dist: pyod>=2.0.5; extra == 'ml'
Requires-Dist: readability>=0.3.2; extra == 'ml'
Requires-Dist: scikit-learn>=1.6.1; extra == 'ml'
Requires-Dist: skorch>=1.0.0; extra == 'ml'
Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'ml'
Requires-Dist: xgboost>=2.1.1; extra == 'ml'
Requires-Dist: yellowbrick>=1.5; extra == 'ml'
Provides-Extra: net
Requires-Dist: aiobotocore>=2.15.1; extra == 'net'
Requires-Dist: aiofile>=3.9.0; extra == 'net'
Requires-Dist: aiofiles>=24.1.0; extra == 'net'
Requires-Dist: aiometer>=0.5.0; extra == 'net'
Requires-Dist: aiopath>=0.6.11; extra == 'net'
Requires-Dist: anyio>=3.7.1; extra == 'net'
Requires-Dist: boto3>=1.36.3; extra == 'net'
Requires-Dist: botocore>=1.36.3; extra == 'net'
Requires-Dist: celery>=5.4.0; extra == 'net'
Requires-Dist: cryptography>=43.0.0; extra == 'net'
Requires-Dist: dask>=2025.2.0; extra == 'net'
Requires-Dist: distributed>=2024.9.1; extra == 'net'
Requires-Dist: fastapi>=0.115.8; extra == 'net'
Requires-Dist: ftputil>=5.1.0; extra == 'net'
Requires-Dist: httpx>=0.27.2; extra == 'net'
Requires-Dist: locust>=2.33.2; extra == 'net'
Requires-Dist: networkx>=3.3; extra == 'net'
Requires-Dist: pandas[aws,fss]>=2.2.3; extra == 'net'
Requires-Dist: passlib>=1.7.4; extra == 'net'
Requires-Dist: pathos>=0.3.3; extra == 'net'
Requires-Dist: polars[async,fsspec]>=1.29.0; extra == 'net'
Requires-Dist: psutil>=6.0.0; extra == 'net'
Requires-Dist: pyshark>=0.6; extra == 'net'
Requires-Dist: pytest-repeat>=0.9.3; extra == 'net'
Requires-Dist: pyzmq>=26.2.0; extra == 'net'
Requires-Dist: redis>=5.2.1; extra == 'net'
Requires-Dist: s3fs>=2024.9.0; extra == 'net'
Requires-Dist: textfsm>=1.1.3; extra == 'net'
Requires-Dist: unsync>=1.4.0; extra == 'net'
Requires-Dist: uvicorn>=0.34.0; extra == 'net'
Provides-Extra: scieng
Requires-Dist: altair>=5.4.1; extra == 'scieng'
Requires-Dist: bokeh>=3.4.3; extra == 'scieng'
Requires-Dist: bottleneck>=1.4.0; extra == 'scieng'
Requires-Dist: connectorx>=0.4.1; extra == 'scieng'
Requires-Dist: dask-image>=2024.5.3; extra == 'scieng'
Requires-Dist: dask>=2025.2.0; extra == 'scieng'
Requires-Dist: distributed>=2024.9.1; extra == 'scieng'
Requires-Dist: duckdb>=1.1.3; extra == 'scieng'
Requires-Dist: fastexcel>=0.12.1; extra == 'scieng'
Requires-Dist: formulaic>=1.1.1; extra == 'scieng'
Requires-Dist: glum>=3.1.2; extra == 'scieng'
Requires-Dist: graphviz>=0.20.3; extra == 'scieng'
Requires-Dist: h5py>=3.11.0; extra == 'scieng'
Requires-Dist: holoviews>=1.19.1; extra == 'scieng'
Requires-Dist: hvplot>=0.10.0; extra == 'scieng'
Requires-Dist: matplotlib>=3.9.2; extra == 'scieng'
Requires-Dist: networkx>=3.3; extra == 'scieng'
Requires-Dist: numba>=0.61.0; extra == 'scieng'
Requires-Dist: pandas[aws,compression,computation,consortium-standard,excel,feather,fss,hdf5,html,output-formatting,parquet,plot,xml]>=2.2.3; extra == 'scieng'
Requires-Dist: pint>=0.24.3; extra == 'scieng'
Requires-Dist: pooch>=1.8.2; extra == 'scieng'
Requires-Dist: pyod>=2.0.5; extra == 'scieng'
Requires-Dist: scikit-image>=0.24.0; extra == 'scieng'
Requires-Dist: scipy>=1.15.2; extra == 'scieng'
Requires-Dist: seaborn>=0.13.2; extra == 'scieng'
Requires-Dist: statsmodels>=0.14.4; extra == 'scieng'
Requires-Dist: streamlit>=1.45.0; extra == 'scieng'
Requires-Dist: sympy>=1.13.3; 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.8.3; extra == 'testing'
Requires-Dist: black>=25.1.0; extra == 'testing'
Requires-Dist: dodgy>=0.2.1; extra == 'testing'
Requires-Dist: flake8-async>=25.3.1; extra == 'testing'
Requires-Dist: flake8-import-order>=0.18.2; extra == 'testing'
Requires-Dist: flake8>=7.1.2; extra == 'testing'
Requires-Dist: gprof2dot>=2024.6.6; extra == 'testing'
Requires-Dist: hypothesis>=6.129.4; extra == 'testing'
Requires-Dist: isort>=6.0.0; extra == 'testing'
Requires-Dist: line-profiler>=4.1.3; 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.0; extra == 'testing'
Requires-Dist: pycodestyle>=2.12.1; extra == 'testing'
Requires-Dist: pyinstrument>=5.0.1; extra == 'testing'
Requires-Dist: pylint>=3.3.6; extra == 'testing'
Requires-Dist: pyt>=1.0.5; extra == 'testing'
Requires-Dist: pytest-cov>=6.0.0; extra == 'testing'
Requires-Dist: pytest-repeat>=0.9.3; extra == 'testing'
Requires-Dist: pytest-xdist>=3.6.1; extra == 'testing'
Requires-Dist: pytest>=8.3.5; extra == 'testing'
Requires-Dist: scalene>=1.5.51; 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.13.2; extra == 'web'
Requires-Dist: beautifulsoup4>=4.13.3; extra == 'web'
Requires-Dist: cryptography>=43.0.0; extra == 'web'
Requires-Dist: django>=5.1.1; extra == 'web'
Requires-Dist: fastapi>=0.115.8; extra == 'web'
Requires-Dist: flask>=3.0.3; extra == 'web'
Requires-Dist: httpx>=0.27.2; extra == 'web'
Requires-Dist: jinja2>=3.1.5; extra == 'web'
Requires-Dist: passlib>=1.7.4; extra == 'web'
Requires-Dist: scrapy>=2.12.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/*
```
