Pre-Commit
pre-commit is a framework for managing and maintaining multi-language pre-commit (git) hooks.
Starting from 10.4.0
, byexample
supports pre-commit
so you can
run the tests automatically before each commit.
The proposed configuration that you need to write in
.pre-commit-config.yaml
in your git repository is:
repos:
- repo: https://github.com/byexamples/byexample
rev: 10.5.2
hooks:
- id: byexample
types_or: [markdown, python]
args: [--no-progress-bar, --jobs=2, -l=python, -l=shell]
The configuration above says that pre-commit
will run byexample
for
all the markdown
and python
files that you modified before the
commit.
You can add more types to the list of course! markdown
and python
are just an example.
The args
are the arguments that are passed as they are to
byexample
.
The most important ones are the language specification. In the example
above -l=python
and -l=shell
means that byexample
will search and
execute Python and Shell snippets (inside the markdown
and python
files).
--no-progress-bar
disables the progress bar of byexample
. It is not
mandatory but it makes the output of pre-commit
a little nicer.
Any other argument can be passed, in the above example --jobs=2
makes
byexample
to process 2 files at the same time.
It is possible to write the arguments for byexample
in a separated file,
let’s name it boptions
, and load it as follows:
repos:
- repo: https://github.com/byexamples/byexample
rev: 10.5.2
hooks:
- id: byexample
types_or: [markdown, python]
args: ['@boptions']
This is perhaps a little cleaner that writing the arguments in
.pre-commit-config.yaml
but it is a matter of taste.
New in
byexample 10.4.0
.
Gotchas when using pre-commit
for Python
pre-commit
runs byexample
in its own private environment. If your
examples requires Python non-standard libraries, these libraries
will not be in the private environment and your examples will fail.
This is a design decision of pre-commit
, however it is possible
to workaround this and escape from the private environment and enter
in the environment of your preference.
byexample
allows you to change
how the interpreter is executed so you
can call explicitly the python
binary of your environment.
Here we added -x-shebang
and "python:%e ./your-env/bin/python %a"
. You
must change the path to your python
binary in your environment.
hooks:
- id: byexample
types_or: [markdown, python]
args: [--no-progress-bar, -l=python, -x-shebang, "python:%e ./your-env/bin/python %a"]
Another way to workaround this is to do a helper script envpy.sh
that activates
and deactivates your environment:
#!/bin/bash
source your-env/bin/activate
python $@
deactivate
Then, call that script as the python
binary in the
shebang:
hooks:
- id: byexample
types_or: [markdown, python]
args: [--no-progress-bar, -l=python, -x-shebang, "python:%e ./envpy %a"]