" File: pep8_fn.vim
" Author: Roman 'gryf' Dobosz (gryf73 at gmail.com)
" Version: 1.0
" Last Modified: 2010-09-12
" Description: {{{
"
" Overview
" --------
" This plugin provides functionality to static checks for python files
" regarding PEP8 guidance[1] as ":Pep8" command.
"
" This function does not use pep8[2] command line utility, but relies on pep8
" module.
"
" This script uses python, therefore VIm should be compiled with python
" support. You can check it by issuing ":version" command, and search for
" "+python" inside features list.
"
" Couple of ideas was taken from pyflakes.vim[3] plugin.
"
" Installation
" ------------
" 1. Copy the pep8_fn.vim file to the $HOME/.vim/ftplugin/python or
"    $HOME/vimfiles/ftplugin/python or $VIM/vimfiles/ftplugin/python
"    directory. If python directory doesn't exists, it should be created.
"    Refer to the following Vim help topics for more information about Vim
"    plugins:
"       :help add-plugin
"       :help add-global-plugin
"       :help runtimepath
" 2. It should be possible to import pep8 from python interpreter (it should
"    report no error):
"    >>> import pep8
"    >>>
"    If there are errors, install pep8 first. Simplest way to do it, is to
"    use easy_install[4] shell command as a root:
"    # easy_install pep8
" 3. Restart Vim.
" 4. You can now use the ":Pep8" which will examine current python buffer
"    and open quickfix buffer with errors if any.
"
" [1] http://www.python.org/dev/peps/pep-0008/
" [2] http://pypi.python.org/pypi/pep8
" [3] http://www.vim.org/scripts/script.php?script_id=2441
" [4] http://pypi.python.org/pypi/setuptools
"
" }}}


if exists("b:did_pep8_plugin")
    finish " only load once
else
    let b:did_pep8_plugin = 1
endif

if !exists("g:pep8_exclude")
    let g:pep8_exclude = []
endif

if !exists("b:did_pep8_init")
    let b:did_pep8_init = 0

    if !has('python')
        echoerr "pep8_fn.vim plugin requires Vim to be compiled with +python"
        finish
    endif

    python << EOF
import vim
import sys
from StringIO import StringIO

try:
    import pep8
except ImportError:
    raise AssertionError('Error: pep8_fn.vim requires module pep8')

class VImPep8(object):

    def __init__(self):
        self.fname = vim.current.buffer.name
        self.bufnr = vim.current.buffer.number
        self.output = []
        self.exclude_list = vim.eval("g:pep8_exclude")

    def reporter(self, lnum, col, text, check):
        self.output.append([lnum, col, text])

    def run(self):
        pep8.process_options(['-r', vim.current.buffer.name])
        checker = pep8.Checker(vim.current.buffer.name)
        checker.report_error = self.reporter
        checker.check_all()
        self.process_output()

    def process_output(self):
        vim.command('call setqflist([])')
        qf_list = []
        qf_dict = {}

        for line in self.output:
            skip = False
            for exclude_pattern in self.exclude_list:
                if exclude_pattern in line[2]:
                    skip = True
                    break
            if skip:
                continue
            qf_dict['bufnr'] = self.bufnr
            qf_dict['lnum'] = line[0]
            qf_dict['col'] = line[1]
            qf_dict['text'] = line[2]
            qf_dict['type'] = line[2][0]
            qf_list.append(qf_dict)
            qf_dict = {}

        self.output = []
        vim.command('call setqflist(%s)' % str(qf_list))
        if qf_list:
            vim.command('copen')
EOF
    let b:did_pep8_init = 1
endif

if !exists('*s:Pep8')
    function s:Pep8()
        python << EOF
VImPep8().run()
EOF
    endfunction
endif

if !exists(":Pep8")
    command Pep8 call s:Pep8()
endif
