Coding conventions
Format
We should format our code with Black, The uncompromising Python code formatter.
We should write docstrings for every public method, function and classes. It does not have to be elaborate. Just explain what it simply does!
$ black PyFunceble && black tests
Note
You can avoid this secion if you use the production-pyfunceble
CLI
which already handles as musch as possible.
Linting
Our code should pass a pylint
check without any issue (exit 0).
$ pylint PyFunceble && pylint tests
Coverage
Our code should have at least 60% of coverage.
Note
Coverage unrelevant code/files can be muted.
$ coverage run setup.py test && coverage report -m
Distribution
Our code should be shipped (after each commit) with a new version and a new
version.yaml
file.
That file should ALWAYS be generated with the following.
Note
An exception is granted for detached branch
(not dev
nor master
) and no code changes.
$ # Prepare our files, :code:`version.yaml` and code for production/dev usage.
$ PyFunceble --production
Commit
All your commits should be - when possible - be signed with PGP.
(More information can be found on GitHub documentation)
Please note the usage of -S
into the commit command which means that
we sign the commit.
The commit message may be formatted like follow:
Note
An exception is granted for no code changes.
- ::
Short explanation (max 79 char).
Paragraphs with some details/context (if needed).
Git Hook
If one may want to automate the process.
Here is a git hook (as proposition) to be set into .git/hooks/pre-commit
.
#!/usr/bin/env bash
# We print what's going on.
set -x
# We stop on error.
set -e
# We get top level path.
rootDirectory="$(git rev-parse --show-toplevel)"
# We construct our list of directories.
ourDirectories="${rootDirectory}/PyFunceble ${rootDirectory}/tests"
if [[ ! -z "$(git status --porcelain | awk '{ if ($NF > 0 && substr($1,1,1) != "?" && $2 ~ '/\.py/' ) print $2}')" ]]
then
hash find
hash isort
hash black
hash pylint
hash coverage
for directory in $(echo ${ourDirectories})
do
# We sort the imports.
find "${directory}" -name "*.py" -exec isort {} \;
# We format the code.
black "${directory}"
# We lint the code.
pylint "${directory}"
done
cd "${rootDirectory}"
coverage run setup.py test
fi
set +e
set +x
exit 0