mirror of
https://fuchsia.googlesource.com/third_party/github.com/pylint-dev/pylint
synced 2024-09-22 00:24:37 +00:00
311 lines
12 KiB
Python
311 lines
12 KiB
Python
# Copyright (c) 2003-2007 LOGILAB S.A. (Paris, FRANCE).
|
|
# This program is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 2 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
import shutil
|
|
import sys
|
|
import os
|
|
import tempfile
|
|
from os.path import join, basename, dirname, isdir, abspath
|
|
from cStringIO import StringIO
|
|
|
|
from logilab.common.testlib import TestCase, unittest_main, create_files
|
|
from logilab.common.compat import sorted
|
|
|
|
from pylint.config import get_note_message
|
|
from pylint.lint import PyLinter, Run, sort_checkers, UnknownMessage
|
|
from pylint.utils import sort_msgs
|
|
from pylint import checkers
|
|
|
|
class SortMessagesTC(TestCase):
|
|
|
|
def test(self):
|
|
l = ['E0501', 'E0503', 'F0002', 'I0201', 'W0540',
|
|
'R0202', 'F0203', 'R0220', 'W0321', 'I0001']
|
|
self.assertEquals(sort_msgs(l), ['E0501', 'E0503',
|
|
'W0321', 'W0540',
|
|
'R0202', 'R0220',
|
|
'I0001', 'I0201',
|
|
'F0002', 'F0203',])
|
|
|
|
try:
|
|
optimized = True
|
|
raise AssertionError
|
|
except AssertionError:
|
|
optimized = False
|
|
|
|
class GetNoteMessageTC(TestCase):
|
|
def test(self):
|
|
msg = None
|
|
for note in range(-1, 11):
|
|
note_msg = get_note_message(note)
|
|
self.assertNotEquals(msg, note_msg)
|
|
msg = note_msg
|
|
if optimized:
|
|
self.assertRaises(AssertionError, get_note_message, 11)
|
|
|
|
|
|
HERE = abspath(dirname(__file__))
|
|
INPUTDIR = join(HERE, 'input')
|
|
|
|
class RunTC(TestCase):
|
|
|
|
def _test_run(self, args, exit_code=1, no_exit_fail=True):
|
|
sys.stdout = sys.sterr = StringIO()
|
|
try:
|
|
try:
|
|
Run(args)
|
|
except SystemExit, ex:
|
|
print sys.stdout.getvalue()
|
|
self.assertEquals(ex.code, exit_code)
|
|
else:
|
|
if no_exit_fail:
|
|
self.fail()
|
|
finally:
|
|
sys.stdout = sys.__stdout__
|
|
sys.stderr = sys.__stderr__
|
|
|
|
|
|
class PyLinterTC(TestCase):
|
|
|
|
def setUp(self):
|
|
self.linter = PyLinter()
|
|
self.linter.disable_message_category('I')
|
|
self.linter.config.persistent = 0
|
|
# register checkers
|
|
checkers.initialize(self.linter)
|
|
|
|
def test_message_help(self):
|
|
msg = self.linter.get_message_help('F0001', checkerref=True)
|
|
expected = ':F0001:\n Used when an error occured preventing the analysis of a module (unable to find\n it for instance). This message belongs to the master checker.'
|
|
self.assertTextEqual(msg, expected)
|
|
self.assertRaises(UnknownMessage, self.linter.get_message_help, 'YB12')
|
|
|
|
def test_enable_message(self):
|
|
linter = self.linter
|
|
linter.open()
|
|
linter.set_current_module('toto')
|
|
self.assert_(linter.is_message_enabled('W0101'))
|
|
self.assert_(linter.is_message_enabled('W0102'))
|
|
linter.disable_message('W0101', scope='package')
|
|
linter.disable_message('W0102', scope='module', line=1)
|
|
self.assert_(not linter.is_message_enabled('W0101'))
|
|
self.assert_(not linter.is_message_enabled('W0102', 1))
|
|
linter.set_current_module('tutu')
|
|
self.assert_(not linter.is_message_enabled('W0101'))
|
|
self.assert_(linter.is_message_enabled('W0102'))
|
|
linter.enable_message('W0101', scope='package')
|
|
linter.enable_message('W0102', scope='module', line=1)
|
|
self.assert_(linter.is_message_enabled('W0101'))
|
|
self.assert_(linter.is_message_enabled('W0102', 1))
|
|
|
|
def test_enable_message_category(self):
|
|
linter = self.linter
|
|
linter.open()
|
|
linter.set_current_module('toto')
|
|
self.assert_(linter.is_message_enabled('W0101'))
|
|
self.assert_(linter.is_message_enabled('R0102'))
|
|
linter.disable_message_category('W', scope='package')
|
|
linter.disable_message_category('R', scope='module')
|
|
self.assert_(not linter.is_message_enabled('W0101'))
|
|
self.assert_(not linter.is_message_enabled('R0102'))
|
|
linter.set_current_module('tutu')
|
|
self.assert_(not linter.is_message_enabled('W0101'))
|
|
self.assert_(linter.is_message_enabled('R0102'))
|
|
linter.enable_message_category('W', scope='package')
|
|
linter.enable_message_category('R', scope='module')
|
|
self.assert_(linter.is_message_enabled('W0101'))
|
|
self.assert_(linter.is_message_enabled('R0102'))
|
|
|
|
def test_enable_message_block(self):
|
|
linter = self.linter
|
|
linter.open()
|
|
filepath = join(INPUTDIR, 'func_block_disable_msg.py')
|
|
linter.set_current_module('func_block_disable_msg')
|
|
linter.process_module(open(filepath))
|
|
orig_state = linter._module_msgs_state.copy()
|
|
linter._module_msgs_state = {}
|
|
linter.collect_block_lines(linter.get_astng(filepath, 'func_block_disable_msg'), orig_state)
|
|
# global (module level)
|
|
self.assert_(linter.is_message_enabled('W0613'))
|
|
self.assert_(linter.is_message_enabled('E1101'))
|
|
# meth1
|
|
self.assert_(linter.is_message_enabled('W0613', 13))
|
|
# meth2
|
|
self.assert_(not linter.is_message_enabled('W0613', 18))
|
|
# meth3
|
|
self.assert_(not linter.is_message_enabled('E1101', 24))
|
|
self.assert_(linter.is_message_enabled('E1101', 26))
|
|
# meth4
|
|
self.assert_(not linter.is_message_enabled('E1101', 32))
|
|
self.assert_(linter.is_message_enabled('E1101', 36))
|
|
# meth5
|
|
self.assert_(not linter.is_message_enabled('E1101', 42))
|
|
self.assert_(not linter.is_message_enabled('E1101', 43))
|
|
self.assert_(linter.is_message_enabled('E1101', 46))
|
|
self.assert_(not linter.is_message_enabled('E1101', 49))
|
|
self.assert_(not linter.is_message_enabled('E1101', 51))
|
|
# meth6
|
|
self.assert_(not linter.is_message_enabled('E1101', 57))
|
|
self.assert_(linter.is_message_enabled('E1101', 61))
|
|
self.assert_(not linter.is_message_enabled('E1101', 64))
|
|
self.assert_(not linter.is_message_enabled('E1101', 66))
|
|
|
|
self.assert_(linter.is_message_enabled('E0602', 57))
|
|
self.assert_(linter.is_message_enabled('E0602', 61))
|
|
self.assert_(not linter.is_message_enabled('E0602', 62))
|
|
self.assert_(linter.is_message_enabled('E0602', 64))
|
|
self.assert_(linter.is_message_enabled('E0602', 66))
|
|
# meth7
|
|
self.assert_(not linter.is_message_enabled('E1101', 70))
|
|
self.assert_(linter.is_message_enabled('E1101', 72))
|
|
self.assert_(linter.is_message_enabled('E1101', 75))
|
|
self.assert_(linter.is_message_enabled('E1101', 77))
|
|
|
|
def test_list_messages(self):
|
|
sys.stdout = StringIO()
|
|
try:
|
|
# just invoke it, don't check the output
|
|
self.linter.list_messages()
|
|
finally:
|
|
sys.stdout = sys.__stdout__
|
|
|
|
def test_lint_ext_module_with_file_output(self):
|
|
self.linter.config.files_output = True
|
|
try:
|
|
self.linter.check('StringIO')
|
|
self.assert_(os.path.exists('pylint_StringIO.txt'))
|
|
self.assert_(os.path.exists('pylint_global.txt'))
|
|
finally:
|
|
try:
|
|
os.remove('pylint_StringIO.txt')
|
|
os.remove('pylint_global.txt')
|
|
except:
|
|
pass
|
|
|
|
def test_enable_report(self):
|
|
self.assertEquals(self.linter.is_report_enabled('R0001'), True)
|
|
self.linter.disable_report('R0001')
|
|
self.assertEquals(self.linter.is_report_enabled('R0001'), False)
|
|
self.linter.enable_report('R0001')
|
|
self.assertEquals(self.linter.is_report_enabled('R0001'), True)
|
|
|
|
def test_set_option_1(self):
|
|
linter = self.linter
|
|
linter.set_option('disable-msg', 'C0111,W0142')
|
|
self.assert_(not linter.is_message_enabled('C0111'))
|
|
self.assert_(not linter.is_message_enabled('W0142'))
|
|
self.assert_(linter.is_message_enabled('W0113'))
|
|
|
|
def test_set_option_2(self):
|
|
linter = self.linter
|
|
linter.set_option('disable-msg', ('C0111', 'W0142') )
|
|
self.assert_(not linter.is_message_enabled('C0111'))
|
|
self.assert_(not linter.is_message_enabled('W0142'))
|
|
self.assert_(linter.is_message_enabled('W0113'))
|
|
|
|
def test_enable_checkers1(self):
|
|
self.linter.enable_checkers(['design'], False)
|
|
self.assertEquals(sorted([c.name for c in self.linter._checkers.values()
|
|
if c.is_enabled()]),
|
|
['basic', 'classes', 'exceptions', 'format', 'imports',
|
|
'master', 'metrics', 'miscellaneous', 'newstyle',
|
|
'similarities', 'typecheck', 'variables'])
|
|
|
|
def test_enable_checkers2(self):
|
|
self.linter.enable_checkers(['design'], True)
|
|
self.assertEquals(sorted([c.name for c in self.linter._checkers.values()
|
|
if c.is_enabled()]),
|
|
['design', 'master'])
|
|
|
|
from pylint import config
|
|
|
|
class ConfigTC(TestCase):
|
|
|
|
def setUp(self):
|
|
os.environ.pop('PYLINTRC', None)
|
|
|
|
def test_pylint_home(self):
|
|
uhome = os.path.expanduser('~')
|
|
if uhome == '~':
|
|
expected = '.pylint.d'
|
|
else:
|
|
expected = os.path.join(uhome, '.pylint.d')
|
|
self.assertEquals(config.PYLINT_HOME, expected)
|
|
|
|
try:
|
|
pylintd = join(tempfile.gettempdir(), '.pylint.d')
|
|
os.environ['PYLINTHOME'] = pylintd
|
|
try:
|
|
reload(config)
|
|
self.assertEquals(config.PYLINT_HOME, pylintd)
|
|
finally:
|
|
try:
|
|
os.remove(pylintd)
|
|
except:
|
|
pass
|
|
finally:
|
|
del os.environ['PYLINTHOME']
|
|
|
|
def test_pylintrc(self):
|
|
try:
|
|
self.assertEquals(config.find_pylintrc(), None)
|
|
os.environ['PYLINTRC'] = join(tempfile.gettempdir(), '.pylintrc')
|
|
self.assertEquals(config.find_pylintrc(), None)
|
|
os.environ['PYLINTRC'] = '.'
|
|
self.assertEquals(config.find_pylintrc(), None)
|
|
finally:
|
|
os.environ.pop('PYLINTRC', '')
|
|
reload(config)
|
|
|
|
def test_pylintrc_parentdir(self):
|
|
chroot = tempfile.mkdtemp()
|
|
try:
|
|
create_files(['a/pylintrc', 'a/b/__init__.py', 'a/b/pylintrc',
|
|
'a/b/c/__init__.py', 'a/b/c/d/__init__.py'], chroot)
|
|
os.chdir(chroot)
|
|
self.assertEquals(config.find_pylintrc(), None)
|
|
results = {'a' : join(chroot, 'a', 'pylintrc'),
|
|
'a/b' : join(chroot, 'a', 'b', 'pylintrc'),
|
|
'a/b/c' : join(chroot, 'a', 'b', 'pylintrc'),
|
|
'a/b/c/d' : join(chroot, 'a', 'b', 'pylintrc'),
|
|
}
|
|
for basedir, expected in results.items():
|
|
os.chdir(join(chroot, basedir))
|
|
self.assertEquals(config.find_pylintrc(), expected)
|
|
finally:
|
|
os.chdir(HERE)
|
|
shutil.rmtree(chroot)
|
|
|
|
|
|
def test_pylintrc_parentdir_no_package(self):
|
|
chroot = tempfile.mkdtemp()
|
|
try:
|
|
create_files(['a/pylintrc', 'a/b/pylintrc', 'a/b/c/d/__init__.py'], chroot)
|
|
os.chdir(chroot)
|
|
self.assertEquals(config.find_pylintrc(), None)
|
|
results = {'a' : join(chroot, 'a', 'pylintrc'),
|
|
'a/b' : join(chroot, 'a', 'b', 'pylintrc'),
|
|
'a/b/c' : None,
|
|
'a/b/c/d' : None,
|
|
}
|
|
for basedir, expected in results.items():
|
|
os.chdir(join(chroot, basedir))
|
|
self.assertEquals(config.find_pylintrc(), expected)
|
|
finally:
|
|
os.chdir(HERE)
|
|
shutil.rmtree(chroot)
|
|
|
|
if __name__ == '__main__':
|
|
unittest_main()
|