PEP-8 is a set of Python style recommendations. pep8
is a module that checks your .py
file for violations. To make your Travis-CI build fail if you have any violations, you could add these lines to your .travis.yml
:
before_install:
- pip install pep8
script:
# Run pep8 on all .py files in all subfolders
# (I ignore "E402: module level import not at top of file"
# because of use case sys.path.append('..'); import <module>)
- find . -name \*.py -exec pep8 --ignore=E402 {} +
However, since this makes my build fail for very trivial violations, like extra whitespace after a line of code, I find it isn't practical to include this check unless I also automatically fix any issues. autopep8
(https://pypi.python.org/pypi/autopep8) can perform this fix; now let's get Travis-CI to run it after every build, and if there are corrections, commit and push these changes.
language: python
python:
- 2.7
- 3.3
- 3.4
- 3.5
- "nightly"
notifications:
email:
recipients:
- my@email.com
on_success: never # default: change
on_failure: always # default: always
before_install:
- sudo apt-get update
- sudo apt-get -y install python-pip
- sudo pip install --upgrade pip
- pip install --upgrade pip
- pip install pep8
- pip install autopep8
script:
# Run pep8 on all .py files in all subfolders
# We must ignore E402 module level import not at top of file
# because of use case sys.path.append('..'); import <module>
- num_errors_before=`find . -name \*.py -exec pep8 --ignore=E402 {} + | wc -l`
- echo $num_errors_before
- cd "$TRAVIS_BUILD_DIR"
- git config --global user.email "my@email.com"
# From https://help.github.com/articles/setting-your-username-in-git/:
# "Tip: You don't have to use your real name--any name works. Git
# actually associates commits by email address; the username is only
# used for identification. If you use your email address associated
# with a GitHub account, we'll use your GitHub username, instead of
# this name.
- git config --global user.name "Travis CI"
- git checkout $TRAVIS_BRANCH
- git pull --rebase # resolve conflicts here. This avoids to force push later
- find . -name \*.py -exec autopep8 --recursive --aggressive --aggressive --in-place {} +
- num_errors_after=`find . -name \*.py -exec pep8 --ignore=E402 {} + | wc -l`
- echo $num_errors_after
- |
if (( $num_errors_after < $num_errors_before )); then
git commit -a -m "PEP-8 Fix"
git config --global push.default simple # Push only to the current branch.
git remote set-url origin https://${GITHUB_API_KEY}@github.com/$TRAVIS_REPO_SLUG/
# Make sure to make the output quiet, or else the API token will
# leak! This works because the API key can replace your password.
git push --quiet
fi
- cd "$TRAVIS_BUILD_DIR"
# List the remaining errors - these will have to be fixed manually
- find . -name \*.py -exec pep8 --ignore=E402 {} +
The code above is intended to be used in a project that involves several developers. To enable collaboration and let other people to use properly the autofix function coded in the previous script and push the result smoothly, use the following instructions:
Partially based on http://stackoverflow.com/questions/23277391/how-to-publish-to-github-pages-from-travis-ci
STEP 1. Get a Personal Access Token under https://github.com/settings/tokens
Only enable "public_repo" access for public repositories, "repo" for private.
Save the token somewhere as you can only see it once.
STEP 2. On the Travis settings for the repository https://travis-ci.org///settings create an environment variable:
GITHUB_API_KEY
with the value equal to the personal token you have obtained from Github and make sure to mark "Display value in build log" as "Off".
This is safe because only authorized pushes by you see such environment variables, so if a malicious user tries to make a pull request to get your string, the variable won't be there.
Just make sure that you never, ever list your environment variables on your build!