Skip to content

Instantly share code, notes, and snippets.

@jvanasco
Last active February 18, 2016 19:34
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 jvanasco/08dbb8ef4c47c4a75bde to your computer and use it in GitHub Desktop.
Save jvanasco/08dbb8ef4c47c4a75bde to your computer and use it in GitHub Desktop.
Flake8 output was giving me a headache, so i wrote this quick parser. It will convert a `--file` of flake8 text to a "checklist" format , json or pretty-printed json.
import argparse
import os.path
import pprint
"""
flake8 parser.
this is a quick and dirty tool.
Flake8 output was giving me a headache, so i wrote this quick parser. It will convert a `--file` of flake8 text to a "checklist" format , json or pretty-printed json.
This will strip a given prefix from the data, and return it in less of a 'WALL OF TEXT'.
I didn't build in support for piping in data directly from STDIN, but the (simple) routines can be imported into a project.
json-pretty
{'foo.py': ['133:76: W291 trailing whitespace'],
'lib/data/bar.py': ['52:1: W293 blank line contains whitespace'],
'lib/data/foo.py': ['101:1: W293 blank line contains whitespace'],
'lib/utils/bar.py': ['605:1: W293 blank line contains whitespace'],
'lib/utils/date.py': ["328:5: F811 redefinition of unused 'currentYear' from line 306",
"331:5: F811 redefinition of unused 'currentMonth' from line 310",
"334:5: F811 redefinition of unused 'currentDay' from line 314"],
'lib/utils/foo.py': ['595:1: W293 blank line contains whitespace']}
checklist
foo.py
133:76: W291 trailing whitespace
lib/data/bar.py
52:1: W293 blank line contains whitespace
lib/data/foo.py
101:1: W293 blank line contains whitespace
lib/utils/bar.py
605:1: W293 blank line contains whitespace
lib/utils/date.py
328:5: F811 redefinition of unused 'currentYear' from line 306
331:5: F811 redefinition of unused 'currentMonth' from line 310
334:5: F811 redefinition of unused 'currentDay' from line 314
lib/utils/foo.py
595:1: W293 blank line contains whitespace
"""
_sample_data = """/Users/me/path/to/project/files/lib/data/bar.py:52:1: W293 blank line contains whitespace
/Users/me/path/to/project/files/lib/data/foo.py:101:1: W293 blank line contains whitespace
/Users/me/path/to/project/files/lib/utils/date.py:328:5: F811 redefinition of unused 'currentYear' from line 306
/Users/me/path/to/project/files/lib/utils/date.py:331:5: F811 redefinition of unused 'currentMonth' from line 310
/Users/me/path/to/project/files/lib/utils/date.py:334:5: F811 redefinition of unused 'currentDay' from line 314
/Users/me/path/to/project/files/lib/utils/foo.py:595:1: W293 blank line contains whitespace
/Users/me/path/to/project/files/lib/utils/bar.py:605:1: W293 blank line contains whitespace
/Users/me/path/to/project/files/foo.py:133:76: W291 trailing whitespace"""
def flake8_to_json(data, prefix=None):
output = {}
prefix_length = None if prefix is None else len(prefix)
data = [l.strip() for l in data.split('\n')]
for line in data:
_newline = False
(_path, _row, _col, _code_text) = line.split(':')
if prefix is not None:
if _path[:prefix_length] == prefix:
_path = _path[prefix_length:]
if _path not in output:
output[_path] = []
output[_path].append(':'.join([_row, _col, _code_text]))
return output
def to_checklist(output):
ks = output.keys()
ks.sort()
as_checklist = []
for k in ks:
as_checklist.append(k)
as_checklist.extend(['\t%s' % i for i in output[k]])
return '\n'.join(as_checklist)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("--file",
help="Which file?",
)
parser.add_argument("--mode",
help="how should the output be formatted? defaults to `checklist`, but `json` and `json-pretty` are valid",
choices=['json', 'json-pretty', 'checklist'],
default='checklist',
)
parser.add_argument("--prefix",
type=str,
help="Use a prefix?",
)
parser.add_argument("--demo",
help="Run in demo mode?",
action='store_true',
)
options = parser.parse_args()
if options.demo:
data = _sample_data
output = flake8_to_json(data, prefix='/Users/me/path/to/project/files/')
as_checklist = to_checklist(output)
print "#" * 20
print "flake8_to_json -----"
pprint.pprint(output)
print "#" * 20
print "as_checklist -----"
print as_checklist
exit()
if not options.file:
print "Outside of `--demo` mode, you must supply a `--file`"
exit()
if not os.path.exists(options.file):
raise ValueError("`%s` is not a valid file." % options.file)
data = open(options.file, 'r').read()
output = flake8_to_json(data, prefix=options.prefix)
if options.mode == 'json-pretty':
pprint.pprint(output)
elif options.mode == 'json':
print output
elif options.mode == 'checklist':
output = to_checklist(output)
print output
"""
http://pep8.readthedocs.org/en/latest/intro.html#example-usage-and-output
$ pep8 testsuite/E40.py --format=default
testsuite/E40.py:2:10: E401 multiple imports on one line
$ pep8 testsuite/E40.py --format=pylint
testsuite/E40.py:2: [E401] multiple imports on one line
$ pep8 testsuite/E40.py --format='%(path)s\n\y%(row)d|%(col)d| %(code)s %(text)s'
testsuite/E40.py|2|10| E401 multiple imports on one line
Variables in the custom format option
Variable Significance
path File name
row Row number
col Column number
code Error code
text Error text
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment