| Index: third_party/pylint/pyreverse/utils.py
|
| diff --git a/third_party/pylint/pyreverse/utils.py b/third_party/pylint/pyreverse/utils.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ea8b67ccd9e00f57dd8c1140d0f07aa71d436ede
|
| --- /dev/null
|
| +++ b/third_party/pylint/pyreverse/utils.py
|
| @@ -0,0 +1,131 @@
|
| +# Copyright (c) 2002-2010 LOGILAB S.A. (Paris, FRANCE).
|
| +# 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.
|
| +"""
|
| +generic classes/functions for pyreverse core/extensions
|
| +"""
|
| +
|
| +import sys
|
| +import re
|
| +import os
|
| +
|
| +########### pyreverse option utils ##############################
|
| +
|
| +
|
| +RCFILE = '.pyreverserc'
|
| +
|
| +def get_default_options():
|
| + """
|
| + Read config file and return list of options
|
| + """
|
| + options = []
|
| + home = os.environ.get('HOME', '')
|
| + if home:
|
| + rcfile = os.path.join(home, RCFILE)
|
| + try:
|
| + options = open(rcfile).read().split()
|
| + except IOError:
|
| + pass # ignore if no config file found
|
| + return options
|
| +
|
| +def insert_default_options():
|
| + """insert default options to sys.argv
|
| + """
|
| + options = get_default_options()
|
| + options.reverse()
|
| + for arg in options:
|
| + sys.argv.insert(1, arg)
|
| +
|
| +
|
| +
|
| +# astng utilities ###########################################################
|
| +
|
| +SPECIAL = re.compile('^__[A-Za-z0-9]+[A-Za-z0-9_]*__$')
|
| +PRIVATE = re.compile('^__[_A-Za-z0-9]*[A-Za-z0-9]+_?$')
|
| +PROTECTED = re.compile('^_[_A-Za-z0-9]*$')
|
| +
|
| +def get_visibility(name):
|
| + """return the visibility from a name: public, protected, private or special
|
| + """
|
| + if SPECIAL.match(name):
|
| + visibility = 'special'
|
| + elif PRIVATE.match(name):
|
| + visibility = 'private'
|
| + elif PROTECTED.match(name):
|
| + visibility = 'protected'
|
| +
|
| + else:
|
| + visibility = 'public'
|
| + return visibility
|
| +
|
| +ABSTRACT = re.compile('^.*Abstract.*')
|
| +FINAL = re.compile('^[A-Z_]*$')
|
| +
|
| +def is_abstract(node):
|
| + """return true if the given class node correspond to an abstract class
|
| + definition
|
| + """
|
| + return ABSTRACT.match(node.name)
|
| +
|
| +def is_final(node):
|
| + """return true if the given class/function node correspond to final
|
| + definition
|
| + """
|
| + return FINAL.match(node.name)
|
| +
|
| +def is_interface(node):
|
| + # bw compat
|
| + return node.type == 'interface'
|
| +
|
| +def is_exception(node):
|
| + # bw compat
|
| + return node.type == 'exception'
|
| +
|
| +
|
| +# Helpers #####################################################################
|
| +
|
| +_CONSTRUCTOR = 1
|
| +_SPECIAL = 2
|
| +_PROTECTED = 4
|
| +_PRIVATE = 8
|
| +MODES = {
|
| + 'ALL' : 0,
|
| + 'PUB_ONLY' : _SPECIAL + _PROTECTED + _PRIVATE,
|
| + 'SPECIAL' : _SPECIAL,
|
| + 'OTHER' : _PROTECTED + _PRIVATE,
|
| +}
|
| +VIS_MOD = {'special': _SPECIAL, 'protected': _PROTECTED, \
|
| + 'private': _PRIVATE, 'public': 0 }
|
| +
|
| +class FilterMixIn:
|
| + """filter nodes according to a mode and nodes' visibility
|
| + """
|
| + def __init__(self, mode):
|
| + "init filter modes"
|
| + __mode = 0
|
| + for nummod in mode.split('+'):
|
| + try:
|
| + __mode += MODES[nummod]
|
| + except KeyError, ex:
|
| + print >> sys.stderr, 'Unknown filter mode %s' % ex
|
| + self.__mode = __mode
|
| +
|
| +
|
| + def show_attr(self, node):
|
| + """return true if the node should be treated
|
| + """
|
| + visibility = get_visibility(getattr(node, 'name', node))
|
| + return not (self.__mode & VIS_MOD[visibility] )
|
| +
|
|
|