diff options
| author | Emile Anclin <emile.anclin@logilab.fr> | 2008-07-30 11:50:12 +0200 |
|---|---|---|
| committer | Emile Anclin <emile.anclin@logilab.fr> | 2008-07-30 11:50:12 +0200 |
| commit | 46ce00219227e7d70eec8b266945df27d4130663 (patch) | |
| tree | ab5df573eaf3942f4c695592db5ac031c28ac1b6 /pyreverse | |
| parent | 673aa2f907b50415c496853aa110e977b1213105 (diff) | |
| parent | bf04f4cc50ef60d56a7b3574e69114a4e59b68e6 (diff) | |
| download | pylint-46ce00219227e7d70eec8b266945df27d4130663.tar.gz | |
merge/conflict
Diffstat (limited to 'pyreverse')
| -rw-r--r-- | pyreverse/diadefslib.py | 60 | ||||
| -rw-r--r-- | pyreverse/utils.py | 20 |
2 files changed, 37 insertions, 43 deletions
diff --git a/pyreverse/diadefslib.py b/pyreverse/diadefslib.py index 0f18839..38b198a 100644 --- a/pyreverse/diadefslib.py +++ b/pyreverse/diadefslib.py @@ -205,40 +205,41 @@ class ClassDiadefGenerator: given class """ - def class_diagram(self, project, klass, linker, - include_level=-1, include_module_name=1): + def __init__(self, linker): + self.linker = linker + + def class_diagram(self, project, klass, + include_level=-1, include_module_name= True): """return a class diagram definition for the given klass and its related klasses. Search deep depends on the include_level parameter (=1 will take all classes directly related, while =2 will also take all classes related to the one fecthed by=1) """ + self.include_module_name = include_module_name + diagram = ClassDiagram(klass) if len(project.modules) > 1: - last_dot = klass.rfind('.') - module = project.get_module(klass[:last_dot]) - klass = klass[last_dot+1:] + module, klass = klass.rsplit('.',1) + module = project.get_module(module) else: module = project.modules[0] klass = klass.split('.')[-1] klass = module.ilookup(klass).next() - self.extract_classes(diagram, klass, linker, - include_level, include_module_name) + self.extract_classes(diagram, klass, include_level) return diagram - def extract_classes(self, diagram, klass_node, linker, - include_level, include_module_name): - """extract classes related to klass_node until include_level is not 0 + def extract_classes(self, diagram, klass_node, include_level): + """extract classes related to klass_node until include_level is 0 """ if include_level == 0 or diagram.has_node(klass_node): return - self.add_class_def(diagram, klass_node, linker, include_module_name) + self.add_class_def(diagram, klass_node) # add all ancestors whatever the include_level ? for ancestor in klass_node.ancestors(): # XXX display of __builtin__.object in the diagram should be configurable if ancestor.name == 'object' and ancestor.root().name == '__builtin__': continue - self.extract_classes(diagram, ancestor, linker, - include_level, include_module_name) + self.extract_classes(diagram, ancestor, include_level) include_level -= 1 # association for name, ass_nodes in klass_node.instance_attrs_type.items(): @@ -249,18 +250,17 @@ class ClassDiadefGenerator: if not isinstance(ass_node, astng.Class) \ or ass_node.root().name == '__builtin__': continue - self.extract_classes(diagram, ass_node, linker, - include_level, include_module_name) + self.extract_classes(diagram, ass_node, include_level) - def add_class_def(self, diagram, klass_node, linker, include_module_name): + def add_class_def(self, diagram, klass_node): """add a class definition to the class diagram """ - if include_module_name: + if self.include_module_name: module_name = klass_node.root().name title = '%s.%s' % (module_name, klass_node.name) else: title = klass_node.name - linker.visit(klass_node) + self.linker.visit(klass_node) diagram.add_object(node=klass_node, title=title) # diagram handler ############################################################# @@ -274,16 +274,17 @@ class DiadefsHandler(OptionsProviderMixIn): name = 'Diagram definition' options = ( ("diadefs", - {'action':"store", 'type':'string', 'metavar': "<file>", - 'short' : 'd', - 'dest':"diadefs_file", 'default':None, - 'help':"create diagram according to the diagrams definitions in \ -<file>"}), + dict(action="store", type='string', metavar="<file>",short='d', + dest="diadefs_file", default=None, + help="create diagram according to the diagrams definitions in \ +<file>")), ("class", - {'action':"append", 'type':'string', 'metavar': "<class>", - 'dest':"classes", 'default':(), - 'help':"create a class diagram with all classes related to <class> "}), - + dict(action="append", type='string', metavar="<class>", + dest="classes", default=(), + help="create a class diagram with all classes related to <class> ")), + ("search-level", + dict(dest="include_level", action="store",#type='int', + metavar='<depth>', default=2, help='depth of related class search') ), ) @@ -300,9 +301,10 @@ class DiadefsHandler(OptionsProviderMixIn): resolver.resolve_classes(class_diagram) for package_diagram in diadefs.get('package-diagram', ()): resolver.resolve_packages(package_diagram) - generator = ClassDiadefGenerator() + generator = ClassDiadefGenerator(linker) + incl_level = int(self.config.include_level) for klass in self.config.classes: - diagrams.append(generator.class_diagram(project, klass, linker)) + diagrams.append(generator.class_diagram(project, klass, incl_level)) # FIXME: generate only if no option provided # or generate one if not diagrams: diff --git a/pyreverse/utils.py b/pyreverse/utils.py index 166b842..4cbc4f6 100644 --- a/pyreverse/utils.py +++ b/pyreverse/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2002-2004 LOGILAB S.A. (Paris, FRANCE). +# Copyright (c) 2002-2008 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 @@ -20,11 +20,7 @@ generic classes/functions for pyreverse core/extensions import sys import re -# why import IgnoreChild, Project ? -#from logilab.astng import ASTNGManager #, IgnoreChild, Project -#from logilab.astng.manager import astng_wrapper from logilab.astng.manager import astng_wrapper, ASTNGManager - from logilab.common.configuration import ConfigurationMixIn from pyreverse.__pkginfo__ import version @@ -102,6 +98,7 @@ MODES = { '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 @@ -146,11 +143,7 @@ class FilterMixIn: mode = self.get_mode() visibility = get_visibility(getattr(node, 'name', node)) - if mode & _SPECIAL and visibility == 'special': - return 0 - if mode & _PROTECTED and visibility == 'protected': - return 0 - if mode & _PRIVATE and visibility == 'private': + if mode & VIS_MOD[visibility]: return 0 return 1 @@ -177,16 +170,15 @@ USAGE: %%prog [options] <file or module>... self.register_options_provider(manager) for provider in option_providers: self.register_options_provider(provider) - #self.load_file_configuration() - args = self.load_command_line_configuration() + files = self.load_command_line_configuration() - if not args: + if not files: print self.help() else: global LOG LOG = self.log # extract project representation - project = manager.project_from_files(args, astng_wrapper) + project = manager.project_from_files(files, astng_wrapper) self.do_run(project) |
