Skip to content

Instantly share code, notes, and snippets.

@cbjuan
Forked from MichaelCurrie/autopep8 Travis-CI.md
Last active September 13, 2017 16:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cbjuan/cdab04a0c96e1792d5fdff6a007b4067 to your computer and use it in GitHub Desktop.
Save cbjuan/cdab04a0c96e1792d5fdff6a007b4067 to your computer and use it in GitHub Desktop.
Automatically fix PEP-8 issues using Travis-CI

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment