cookiecutter gh:TezRomacH/python-package-templateIn this cookiecutter template, we aimed to combine the most state-of-the-art libraries and best development practices for Python.
For your development we've prepared:
- Supports for
Python 3.7and higher. Poetryas the dependencies manager. See configuration inpyproject.tomlandsetup.cfg.- Power of
black,isortandpyupgradeformatters. - Ready-to-use
pre-commithooks with formatters above. - Type checks with the configured
mypy. - Testing with
pytest. - Docstring checks with
darglint. - Security checks with
safetyandbandit. - Well-made
.editorconfig,.dockerignore, and.gitignore. You don't have to worry about those things.
For building and deployment:
GitHubintegration.Makefilefor building routines. Everything is already set up for security checks, codestyle checks, code formatting, testing, linting, docker builds, etc. More details at Makefile summary).- Dockerfile for your package.
Github Actionswith predefined build workflow as the default CI/CD.- Always up-to-date dependencies with
@dependabot(You will only need to setup free plan). - Automatic drafts of new releases with
Release Drafter. It creates a list of changes based on labels in mergedPull Requests. You can see labels (akacategories) inrelease-drafter.yml. Works perfectly with Semantic Versions specification.
For creating your open source community:
- Ready-to-use Pull Requests templates and several Issue templates.
- Files such as:
LICENSE,CONTRIBUTING.md,CODE_OF_CONDUCT.md, andSECURITY.mdare generated automatically. Stale botthat closes abandoned issues after a period of inactivity. (You will only need to setup free plan). Configuration is here.- Semantic Versions specification with
Release Drafter.
Before creating a new project from this template, you need to install the dependencies:
pip install -U cookiecutter liceGo to the directory where you want to create your project and run:
cookiecutter gh:TezRomacH/python-package-templateThe cookiecutter generator will ask you for some data, you might want to have at hand before generating the project.
The input variables, with their default values (some auto-generated), are:
| Parameter | Default value | Description |
|---|---|---|
project_name |
python-project |
The name of the project. It might be a good idea to check the availability of such name before creating the project. |
project_description |
based on the project_name |
Brief description of your project. |
organization |
based on the project_name |
Name of the organization. This is needed to generate the license file and to specify the ownership of the project in pyproject.toml. |
license |
MIT |
Type of license. One of MIT, BSD-3, GNU GPL v3.0 and Apache Software License 2.0. |
version |
0.1.0 |
An initial version of the package. Make sure it follows the Semantic Versions specification. |
github_name |
based on the organization |
GitHub username where the package will be hosted. The cookiecutter will use this name to correctly configure the README.md, pyproject.toml and template files for GitHub. |
email |
based on the organization |
Email is needed for generating the CODE_OF_CONDUCT.md, SECURITY.md files and to specify the ownership of the project in pyproject.toml. |
The entered values will be saved in the cookiecutter-config-file.yml file so that you don't lose them. π
After using this generator, your new project (the directory created) will contain an extensive README.md with instructions for development, deployment, etc. You can pre-read the project README.md template here too.
By running make install
After you run the cookiecutter command and the project appears in your directory, the console will display a message about how to initialize the project.
All manipulations with dependencies are executed through Poetry. If you're new to it, look through the documentation.
Notes about Poetry
Poetry's commands are very intuitive and easy to learn, like:
poetry add numpypoetry run pytestpoetry build- etc
The template comes with a cute little CLI application example. It uses Typer to CLI and Rich for beautiful formatting in the terminal output.
After installation via make install (preferred) or poetry install you can try to play with the example:
poetry run <project_name> --helppoetry run <project_name> --name RomanBuilding a new version of the application contains steps:
- Bump the version of your package
poetry version <version>. You can pass the new version explicitly, or a rule such asmajor,minor, orpatch. For more details, refer to the Semantic Versions standard. - Make a commit to
GitHub. - Create a
GitHub release. - And... publish π
poetry publish --build
Makefile contains many functions for fast assembling and convenient work.
1. Download Poetry
make download-poetry2. Install all dependencies and pre-commit hooks
make installIf you do not want to install pre-commit hooks, run the command with the NO_PRE_COMMIT flag:
make install NO_PRE_COMMIT=13. Check the security of your code
make check-safetyThis command launches a Poetry and Pip integrity check as well as identifies security issues with Safety and Bandit. By default, the build will not crash if any of the items fail. But you can set STRICT=1 for the entire build, or you can configure strictness for each item separately.
make check-safety STRICT=1or only for safety:
make check-safety SAFETY_STRICT=1multiple
make check-safety PIP_STRICT=1 SAFETY_STRICT=1List of flags for
check-safety(can be set to1or0):STRICT,POETRY_STRICT,PIP_STRICT,SAFETY_STRICT,BANDIT_STRICT.
4. Check the codestyle
The command is similar to check-safety but to check the code style, obviously. It uses Black, Darglint, Isort, and Mypy inside.
make check-styleIt may also contain the STRICT flag.
make check-style STRICT=1List of flags for
check-style(can be set to1or0):STRICT,BLACK_STRICT,DARGLINT_STRICT,ISORT_STRICT,MYPY_STRICT.
5. Run all the codestyle formaters
Codestyle uses pre-commit hooks, so ensure you've run make install before.
make codestyle6. Run tests
make test7. Run all the linters
make lintthe same as:
make test && make check-safety && make check-styleList of flags for
lint(can be set to1or0):STRICT,POETRY_STRICT,PIP_STRICT,SAFETY_STRICT,BANDIT_STRICT,BLACK_STRICT,DARGLINT_STRICT,ISORT_STRICT,MYPY_STRICT.
8. Build docker
make dockerwhich is equivalent to:
make docker VERSION=latestMore information here.
Well, that's up to you. I can only recommend the packages and articles that helped me.
Packages:
Typeris great for creating CLI applications.Richmakes it easy to add beautiful formatting in the terminal.FastAPIis a type-driven asynchronous web framework.IceCreamis a little library for sweet and creamy debugging.Returnsmakes you function's output meaningful, typed, and safe!Pydanticβ data validation and settings management using Python type hinting.
Articles:
- Open Source Guides.
- GitHub Actions Documentation.
- Maybe you would like to add gitmoji to commit names. This is really funny. π
You can see the list of available releases on the GitHub Releases page.
We follow Semantic Versions specification.
We use Release Drafter. As pull requests are merged, a draft release is kept up-to-date listing the changes, ready to publish when youβre ready. With the categories option, you can categorize pull requests in release notes using labels.
For Pull Request we configured this labels:
| Label | Title in Releases |
|---|---|
enhancement, feature |
π Features |
bug, refactoring, bugfix, fix |
π§ Fixes & Refactoring |
build, ci, testing |
π¦ Build System & CI/CD |
breaking |
π₯ Breaking Changes |
documentation |
π Documentation |
dependencies |
β¬οΈ Dependencies updates |
This template will continue to develop and follow the bleeding edge new tools and best practices to improve the Python development experience.
Here is a list of things that have yet to be implemented:
- Add examples of libraries created using this template.
- Tests coverage reporting (
Codecov?). - Builtin integration with Code Climate, Deepsource and CodeFactor (they are free for Open Source).
- Auto uploading your package to
PyPI. - Automatic creation and deployment of documentation to GitHub pages (I'm mostly looking at
MkDocswith Material Design theme andmkdocstrings). - Code metrics with
Radon. - Docstring coverage with
interrogate Dockerfilelinting withdockerfilelint.- Hall of fame from
Sourcerer. - Some advanced Python linting (?).
- Refactor
Makefile - Help text for all functions in
Makefile. - Add the option to select the minimum version of Python:
3.7or3.8 - End-to-end testing and validation of the cookiecutter template.
This project is licensed under the terms of the MIT license. See LICENSE for more details.
This template was inspired by those great articles:
- Hypermodern Python
- Ultimate Setup for Your Next Python Project
- Nine simple steps for better-looking python code
and repositories:
Cookiecutterwemake-python-package- Audreyr's
cookiecutter-pypackage - Full Stack FastAPI and PostgreSQL - Base Project Generator
- Cookiecutter Data Science Template:
cdst
Give them your βοΈ, these resources are amazing! π
@misc{python-package-template,
author = {Roman Tezikov},
title = {Python Packages Project Generator},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/TezRomacH/python-package-template}}
}