cookiecutter gh:TezRomacH/python-package-template
In 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.7
and higher. Poetry
as the dependencies manager. See configuration inpyproject.toml
andsetup.cfg
.- Power of
black
,isort
andpyupgrade
formatters. - Ready-to-use
pre-commit
hooks with formatters above. - Type checks with the configured
mypy
. - Testing with
pytest
. - Docstring checks with
darglint
. - Security checks with
safety
andbandit
. - Well-made
.editorconfig
,.dockerignore
, and.gitignore
. You don't have to worry about those things.
For building and deployment:
GitHub
integration.Makefile
for 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 Actions
with 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.md
are generated automatically. Stale bot
that 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 lice
Go to the directory where you want to create your project and run:
cookiecutter gh:TezRomacH/python-package-template
The 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 numpy
poetry run pytest
poetry 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> --help
poetry run <project_name> --name Roman
Building 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-poetry
2. Install all dependencies and pre-commit hooks
make install
If you do not want to install pre-commit hooks, run the command with the NO_PRE_COMMIT flag:
make install NO_PRE_COMMIT=1
3. Check the security of your code
make check-safety
This 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=1
or only for safety
:
make check-safety SAFETY_STRICT=1
multiple
make check-safety PIP_STRICT=1 SAFETY_STRICT=1
List of flags for
check-safety
(can be set to1
or0
):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-style
It may also contain the STRICT
flag.
make check-style STRICT=1
List of flags for
check-style
(can be set to1
or0
):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 codestyle
6. Run tests
make test
7. Run all the linters
make lint
the same as:
make test && make check-safety && make check-style
List of flags for
lint
(can be set to1
or0
):STRICT
,POETRY_STRICT
,PIP_STRICT
,SAFETY_STRICT
,BANDIT_STRICT
,BLACK_STRICT
,DARGLINT_STRICT
,ISORT_STRICT
,MYPY_STRICT
.
8. Build docker
make docker
which is equivalent to:
make docker VERSION=latest
More information here.
Well, that's up to you. I can only recommend the packages and articles that helped me.
Packages:
Typer
is great for creating CLI applications.Rich
makes it easy to add beautiful formatting in the terminal.FastAPI
is a type-driven asynchronous web framework.IceCream
is a little library for sweet and creamy debugging.Returns
makes 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
MkDocs
with Material Design theme andmkdocstrings
). - Code metrics with
Radon
. - Docstring coverage with
interrogate
Dockerfile
linting 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.7
or3.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:
Cookiecutter
wemake-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}}
}