summaryrefslogtreecommitdiff
path: root/checkers/stdlib.py
diff options
context:
space:
mode:
authorTorsten Marek <tmarek@google.com>2013-06-19 11:46:37 +0200
committerTorsten Marek <tmarek@google.com>2013-06-19 11:46:37 +0200
commit2a6d71de051c968b1f3e7aece294109fc920fd94 (patch)
treec996cd541d91b313f6c9b64fbc29dbae4f28dfca /checkers/stdlib.py
parent3ed1282153b4471c0c0e226fff7f1356d90a54f1 (diff)
downloadpylint-2a6d71de051c968b1f3e7aece294109fc920fd94.tar.gz
Add bad-open-mode warning for invalid open modes specified on open/file calls.
Diffstat (limited to 'checkers/stdlib.py')
-rw-r--r--checkers/stdlib.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/checkers/stdlib.py b/checkers/stdlib.py
new file mode 100644
index 0000000..364633b
--- /dev/null
+++ b/checkers/stdlib.py
@@ -0,0 +1,62 @@
+# Copyright 2012 Google Inc.
+#
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+# 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.
+"""Checkers for various standard library functions."""
+
+import re
+
+import astroid
+
+from pylint.interfaces import ITokenChecker, IAstroidChecker
+from pylint.checkers import BaseChecker, BaseTokenChecker
+from pylint.checkers import utils
+
+_VALID_OPEN_MODE_REGEX = r'^(r?U|[rwa]\+?b?)$'
+
+
+class OpenModeChecker(BaseChecker):
+ __implements__ = (IAstroidChecker,)
+ name = 'open_mode'
+
+ msgs = {
+ 'W1501': ('"%s" is not a valid mode for open.',
+ 'bad-open-mode',
+ 'Python supports: r, w, a modes with b, +, and U options. '
+ 'See http://docs.python.org/2/library/functions.html#open'),
+ }
+
+ @utils.check_messages('W1501')
+ def visit_callfunc(self, node):
+ """Visit a CallFunc node."""
+ if (hasattr(node, 'func') and utils.is_builtin_object(utils.safe_infer(node.func))):
+ if getattr(node.func, 'name', None) in ('open', 'file'):
+ self._check_open_mode(node)
+
+ def _check_open_mode(self, node):
+ """Check that the mode argument of an open or file call is valid."""
+ try:
+ mode_arg = utils.get_argument_from_call(node, position=1, keyword='mode')
+ if mode_arg:
+ mode_arg = utils.safe_infer(mode_arg)
+ if (isinstance(mode_arg, astroid.Const)
+ and not re.match(_VALID_OPEN_MODE_REGEX, mode_arg.value)):
+ self.add_message('W1501', node=node, args=(mode_arg.value))
+ except (utils.NoSuchArgumentError, TypeError):
+ pass
+
+def register(linter):
+ """required method to auto register this checker """
+ linter.register_checker(OpenModeChecker(linter))
+