Advanced usage

Automated tests

You can also execute pycodestyle tests from Python code. For example, this can be highly useful for automated testing of coding style conformance in your project:

import unittest
import pycodestyle


class TestCodeFormat(unittest.TestCase):

    def test_conformance(self):
        """Test that we conform to PEP-8."""
        style = pycodestyle.StyleGuide(quiet=True)
        result = style.check_files(['file1.py', 'file2.py'])
        self.assertEqual(result.total_errors, 0,
                         "Found code style errors (and warnings).")

If you are using nosetests for running tests, remove quiet=True since Nose suppresses stdout.

There’s also a shortcut for checking a single file:

import pycodestyle

fchecker = pycodestyle.Checker('testsuite/E27.py', show_source=True)
file_errors = fchecker.check_all()

print("Found %s errors (and warnings)" % file_errors)

Configuring tests

You can configure automated pycodestyle tests in a variety of ways.

For example, you can pass in a path to a configuration file that pycodestyle should use:

import pycodestyle

style = pycodestyle.StyleGuide(config_file='/path/to/tox.ini')

You can also set specific options explicitly:

style = pycodestyle.StyleGuide(ignore=['E501'])

Skip file header

Another example is related to the feature request #143: skip a number of lines at the beginning and the end of a file. This use case is easy to implement through a custom wrapper for the PEP 8 library:

#!python
import pycodestyle

LINES_SLICE = slice(14, -20)

class StyleGuide(pycodestyle.StyleGuide):
    """This subclass of pycodestyle.StyleGuide will skip the first and last lines
    of each file."""

    def input_file(self, filename, lines=None, expected=None, line_offset=0):
        if lines is None:
            assert line_offset == 0
            line_offset = LINES_SLICE.start or 0
            lines = pycodestyle.readlines(filename)[LINES_SLICE]
        return super(StyleGuide, self).input_file(
            filename, lines=lines, expected=expected, line_offset=line_offset)

if __name__ == '__main__':
    style = StyleGuide(parse_argv=True, config_file=True)
    report = style.check_files()
    if report.total_errors:
        raise SystemExit(1)

This module declares a lines’ window which skips 14 lines at the beginning and 20 lines at the end. If there’s no line to skip at the end, it could be changed with LINES_SLICE = slice(14, None) for example.

You can save it in a file and use it with the same options as the original pycodestyle.