roboflow / template-python

A template repo holding our common setup for a python project
96 stars 18 forks source link

Python Template 🐍

A template repo holding our common setup for a python project.

Installation

You can install the package using pip

pip install -e .

or for development

pip install -e ".[dev]"

Structure

The project has the following structure

β”œβ”€β”€ .github
β”‚   └── workflows
β”‚       └── test.yml # holds our github action config 
β”œβ”€β”€ .gitignore
β”œβ”€β”€ Makefile
β”œβ”€β”€ README.md
β”œβ”€β”€ setup.py
β”œβ”€β”€ src
β”‚   β”œβ”€β”€ __init__.py 
β”‚   β”œβ”€β”€ hello.py 
└── test 
    └── test_hello.py

Code Quality 🧹

We provide two handy commands inside the Makefile, namely:

So far, there is no types checking with mypy. See issue.

Tests πŸ§ͺ

pytests is used to run our tests.

Publish on PyPi πŸš€

Important: Before publishing, edit __version__ in src/init to match the wanted new version.

We use twine to make our life easier. You can publish by using

export PYPI_USERNAME="you_username"
export PYPI_PASSWORD="your_password"
export PYPI_TEST_PASSWORD="your_password_for_test_pypi"
make publish -e PYPI_USERNAME=$PYPI_USERNAME -e PYPI_PASSWORD=$PYPI_PASSWORD -e PYPI_TEST_PASSWORD=$PYPI_TEST_PASSWORD

You can also use token for auth, see pypi doc. In that case,

export PYPI_USERNAME="__token__"
export PYPI_PASSWORD="your_token"
export PYPI_TEST_PASSWORD="your_token_for_test_pypi"
make publish -e PYPI_USERNAME=$PYPI_USERNAME -e PYPI_PASSWORD=$PYPI_PASSWORD -e PYPI_TEST_PASSWORD=$PYPI_TEST_PASSWORD

Note: We will try to push to test pypi before pushing to pypi, to assert everything will work

CI/CD πŸ€–

We use GitHub actions to automatically run tests and check code quality when a new PR is done on main.

On any pull request, we will check the code quality and tests.

When a new release is created, we will try to push the new code to PyPi. We use twine to make our life easier.

The correct steps to create a new realease are the following:

The CI will run when you create the new release.

Q&A

Why no cookiecutter?

This is a template repo, it's meant to be used inside GitHub upon repo creation.

Why reinvent the wheel?

There are several very good templates on GitHub, I prefer to use code we wrote instead of blinding taking the most starred template and having features we don't need. From experience, it's better to keep it simple and general enough for our specific use cases.