python-cmd2 / cmd2

cmd2 - quickly build feature-rich and user-friendly interactive command line applications in Python
https://cmd2.readthedocs.io/en/stable/
MIT License
610 stars 115 forks source link

Modernize build system to be based on pyproject.toml #1334

Open anselor opened 1 week ago

anselor commented 1 week ago

We need to replace the legacy build system based on setup.py, setup.cfg with a modern Python one based on pyproject.toml. This guide on How to modernize a setup.py based project has some useful pointers on where to start. setup.cfg should be deleted entirely and all configuration moved to pyproject.toml. Any python setup.py commands need to be migrated to a modern python -m build or python -m pip install command.

There are several more advanced build system tools which are worth exploring. The current default recommendation from python seems to be hatch. It has impressive features including declaring build/test configurations and managing venv environments. @anselor tried hatch on a couple small projects and found it to be much faster than using nox to set up venvs. The problem is it currently doesn't support a monorepo project with multiple modules or plugin modules. There is a development ticket (https://github.com/pypa/hatch/issues/233) that documents it and it is under active development now. Once that is complete we should be able to migrate to hatch with minimal fuss.

A newer alternative that is taking the Python world by storm is uv which is an extremely fast Python package and project manager, written in Rust. uv is a single tool to replace pip, pip-tools, pipx, poetry, pyenv, virtualenv, pipenv and more. I've used this at work to replace pip in some builds and it has typically sped things up by a factor of 2x.

tleonhardt commented 1 week ago

I like the idea of moving to something like either hatch or uv and getting rid of nox for running our tests in multiple python environments.

I tried moving to a more modern Python project setup where everything is in pyproject.toml and there are no setup.cfg or setup.py files, but I couldn't get that working properly with nox.

On a semi-related note, I'd already replaced the mix of flake8, black, and isort for auto-formatting and linting with ruff which is far faster.

tleonhardt commented 1 week ago

1336 handles the moving to ruff from black, isort, and flake8

tleonhardt commented 1 week ago

1343 Moved the doc8 config to pyrproject.toml from setup.cfg

tleonhardt commented 1 week ago

1344 Moves the mypy config to pyproject.toml from setup.cfg

tleonhardt commented 1 week ago

1345 Moves pytest config to pyproject.toml from setup.cfg and deletes setup.cfg entirely