You need to modify some fields e.g. make them required? Use this template and create your own BO4E in just a few minutes! 🚀
This is a template repository. It doesn't contain any useful code but a minimal working setup for a BO4E project in Python including:
- a basic project structure with
- tox.ini
pyproject.toml
where the project metadata and dependencies are defined- and a requirements.txt derived from it
- an example class
- an example unit test (using pytest)
- the BO4E models, autogenerated by
tox -e generate_bo4e
- ready to use Github Actions for
- pytest
- code coverage measurement (fails below 80% by default)
- pylint (only accepts 10/10 code rating by default)
- mypy (static type checks where possible)
- black code formatter check
- isort import order check
- codespell spell check (including an ignore list)
- BO4E consistency check to ensure that the autogenerated code is consistent with the BO4E schema settings
- BO4E update check (as cronjob) working very similar to dependabot
- Dependabot auto-approve / -merge:
- If the actor is the Dependabot bot (i.e. on every commit by Dependabot) the pull request is automatically approved and auto merge gets activated (using squash merge). Note that if you haven't enabled "auto merge" for your repository, the auto merge activation will fail. If you want to use a merge type other than "squash merge" you have to edit the workflow.
- ready-to-use publishing workflow for pypi (see readme section below)
By default, it uses Python version 3.12.
This repository uses a src
-based layout.
This approach has many advantages and basically means for developers, that all business logic lives in the src
directory.
This introduction assumes that you have tox installed already (
see installation instructions) and that a .toxbase
environment
has been created.
.toxbase
is a project independent virtual environment-template for all the tox environments on your machine. If anything is weird during the tox installation or after the installation, try turning your computer off and on again before getting too frustrated.
Also on new windows machines it is possible that the execution policy is set to restricted and you are not allowed execute scripts. You can find detailed information here.
The quickest way to solve this problem: Open an Administrator Powershell (e.g. Windows PowerShell App)
Set-ExecutionPolicy -ExecutionPolicy AllSigned
and try again (with your regular user, not as admin).
If all problems are solved and you're ready to start:
- clone the repository, you want to work in
- create the
dev
environment on your machine. To do this: a) Open a Powershell b) change directory to your repository and finally type
tox -e dev
You have now created the development environment (dev environment). It is the environment which contains both the usual requirements as well as the testing and linting tools.
- You have cloned the repository, you want to work in, and have created the virtual environment, in which the repository should be executed (
your_repo/.tox/dev
). Now, to actually work inside the newly created environment, you need to tell PyCharm (your IDE) that it should use the virtual environment - to be more precise: the interpreter of this dev environment. How to do this: a) navigate to: File ➡ Settings (Strg + Alt + S) ➡ Project: your_project ➡ Python Interpreter ➡ Add interpreter ➡ Existing b) Choose as interpreter:your_repo\.tox\dev\Scripts\python.exe
(under windows) - Set the default test runner of your project to pytest. How to do it: a) navigate to Files ➡ Settings ➡ Tools ➡ Python integrated tools ➡ Testing: Default test runner b) Change to "pytest" If this doesn't work anymore, see the PyCharm docs
- Set the
src
directory as sources root. How to do this: right click on 'src' ➡ "Mark directory as…" ➡ sources root If this doesn't work anymore, see: PyCharm docs. Setting thesrc
directory right, allows PyCharm to effectively suggest import paths. If you ever see something likefrom src.mypackage.mymodule import ...
, then you probably forgot this step. - Set the working directory of the unit tests to the project root (instead of the unittest directory). How to do this:
a) Open any test file whose name starts with
test_
in unit tests/tests b) Right click inside the code ➡ More Run/Debug ➡ Modify Run Configuration ➡ Working directory c) Change toyour_repo
instead ofyour_repo\unittests
By doing so, the import and other file paths in the tests are relative to the repo root. If this doesn't work anymore, see: working directory of the unit tests
All paths mentioned in this section are relative to the repository root.
- Open the folder with VS Code.
- Select the python interpreter (official docs) which is created by tox. Open the command pallett with
CTRL + P
and typePython: Select Interpreter
. Select the interpreter which is placed in.tox/dev/Scripts/python.exe
under Windows or.tox/dev/bin/python
under Linux and macOS. - Set up pytest and pylint. Therefore we open the file
.vscode/settings.json
which should be automatically generated during the interpreter setup. If it doesn't exist, create it. Insert the following lines into the settings:
{
"python.testing.unittestEnabled": false,
"python.testing.nosetestsEnabled": false,
"python.testing.pytestEnabled": true,
"pythonTestExplorer.testFramework": "pytest",
"python.testing.pytestArgs": ["unittests"],
"python.linting.pylintEnabled": true
}
- Create a
.env
file and insert the following line
For Windows:
PYTHONPATH=src;${PYTHONPATH}
For Linux and Mac:
PYTHONPATH=src:${PYTHONPATH}
This makes sure, that the imports are working for the unittests. At the moment I am not totally sure that it is the best practise, but it's getting the job done.
- Enjoy 🤗
To learn how to customize your BO4E, you can take a look at the config-file at bo4e/bo4e_config.py
.
A little explanation can be found at the documentation of the
BO4E-Schema-Tool.
When you have made your changes and set up the repository, you can just run tox -e generate_bo4e
to (re-)generate
the BO4E-models.
This repository contains all necessary CI steps to publish any project created from it on PyPI. It uses the trusted publishers workflow as described in the official Python documentation. It just requires some manual adjustments/settings depending on your project:
- Fill out the metadata in the
pyproject.toml
; Namely the package name and the dependencies which should be in sync with yourrequirements.in
. - Uncomment the lines in
.github/workflows/python-publish.yml
- Create a new environment in your GitHub repository and call it
release
. - Set up a new trusted publisher in your PYPI account.
- PyPI Project Name: The name which you defined in the
pyproject.toml
is the name of the project which you have to enter here. - Owner: The GitHub organization name or GitHub username that owns the repository
- Repository name: The name of the GitHub repository that contains the publishing workflow
- Workflow name: The filename of the publishing workflow. This file should exist in the .github/workflows/ directory in the repository configured above. Here in our case:
python-publish.yml
- Environment name: The name of the GitHub Actions environment that the above workflow uses for publishing. Here in our case:
release
- PyPI Project Name: The name which you defined in the
- Now create a release by clicking on "Create new release" in the right Github sidebar (or visit
github.com/your-username/your-reponame/releases/new
). This should trigger the workflow (see the "Actions" tab of your repo). - Check if the action failed. If it succeeded your PyPI account should now show the new project. It might take some minutes until the package can be installed via
pip install packagename
because the index has to be updated. - Now create another PyPI token with limited scope and update the Github repository secret accordingly.
You are very welcome to contribute to this template repository by opening a pull request against the main branch.