bee_python 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +202 -0
- data/build/README +23 -0
- data/egg/egg/build.yml +70 -0
- data/egg/egg/ez_setup.py +280 -0
- data/egg/egg/script.py +12 -0
- data/egg/egg/setup.erb +11 -0
- data/egg/egg/suite.py +37 -0
- data/egg/egg/test.py +31 -0
- data/egg/egg.yml +69 -0
- data/egg/http/build.erb +53 -0
- data/egg/http/server.py +34 -0
- data/egg/http.yml +50 -0
- data/egg/mysql/mysql.py +43 -0
- data/egg/mysql.yml +44 -0
- data/egg/project/build.erb +77 -0
- data/egg/project/script.py +42 -0
- data/egg/project/test.py +31 -0
- data/egg/project.yml +59 -0
- data/egg/script/build.erb +35 -0
- data/egg/script/script.py +42 -0
- data/egg/script.yml +50 -0
- data/egg/soap/build.erb +52 -0
- data/egg/soap/client.py +18 -0
- data/egg/soap/server.py +30 -0
- data/egg/soap.yml +58 -0
- data/egg/source/source.py +42 -0
- data/egg/source.yml +47 -0
- data/egg/test/test.py +28 -0
- data/egg/test.yml +44 -0
- data/egg/xmlrpc/build.erb +52 -0
- data/egg/xmlrpc/client.py +22 -0
- data/egg/xmlrpc/server.py +24 -0
- data/egg/xmlrpc.yml +51 -0
- data/lib/bee_task_python.rb +390 -0
- data/test/build.yml +16 -0
- data/test/tc_bee_task_python.rb +27 -0
- data/test/test_build.rb +26 -0
- data/test/test_build_listener.rb +62 -0
- data/test/ts_bee_python.rb +26 -0
- data/tools/common/__init__.py +5 -0
- data/tools/common/common/__init__.py +140 -0
- data/tools/common/common/__pkginfo__.py +43 -0
- data/tools/common/common/adbh.py +35 -0
- data/tools/common/common/cache.py +114 -0
- data/tools/common/common/changelog.py +234 -0
- data/tools/common/common/clcommands.py +181 -0
- data/tools/common/common/cli.py +212 -0
- data/tools/common/common/compat.py +328 -0
- data/tools/common/common/configuration.py +1087 -0
- data/tools/common/common/contexts.py +58 -0
- data/tools/common/common/corbautils.py +117 -0
- data/tools/common/common/daemon.py +171 -0
- data/tools/common/common/date.py +279 -0
- data/tools/common/common/db.py +49 -0
- data/tools/common/common/dbf.py +229 -0
- data/tools/common/common/debugger.py +208 -0
- data/tools/common/common/decorators.py +190 -0
- data/tools/common/common/deprecation.py +118 -0
- data/tools/common/common/fileutils.py +409 -0
- data/tools/common/common/graph.py +259 -0
- data/tools/common/common/html.py +142 -0
- data/tools/common/common/interface.py +76 -0
- data/tools/common/common/logging_ext.py +166 -0
- data/tools/common/common/modutils.py +670 -0
- data/tools/common/common/optik_ext.py +383 -0
- data/tools/common/common/optparser.py +92 -0
- data/tools/common/common/pdf_ext.py +111 -0
- data/tools/common/common/proc.py +276 -0
- data/tools/common/common/pyro_ext.py +146 -0
- data/tools/common/common/pytest.py +754 -0
- data/tools/common/common/shellutils.py +383 -0
- data/tools/common/common/sphinx_ext.py +87 -0
- data/tools/common/common/sphinxutils.py +122 -0
- data/tools/common/common/sqlgen.py +31 -0
- data/tools/common/common/table.py +930 -0
- data/tools/common/common/tasksqueue.py +97 -0
- data/tools/common/common/test/__init__.py +1 -0
- data/tools/common/common/test/data/ChangeLog +184 -0
- data/tools/common/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
- data/tools/common/common/test/data/__init__.py +1 -0
- data/tools/common/common/test/data/content_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/content_differ_dir/README +1 -0
- data/tools/common/common/test/data/content_differ_dir/subdir/coin +1 -0
- data/tools/common/common/test/data/content_differ_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/file_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/file_differ_dir/README +1 -0
- data/tools/common/common/test/data/file_differ_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
- data/tools/common/common/test/data/find_test/__init__.py +0 -0
- data/tools/common/common/test/data/find_test/foo.txt +0 -0
- data/tools/common/common/test/data/find_test/module.py +0 -0
- data/tools/common/common/test/data/find_test/module2.py +0 -0
- data/tools/common/common/test/data/find_test/newlines.txt +0 -0
- data/tools/common/common/test/data/find_test/noendingnewline.py +0 -0
- data/tools/common/common/test/data/find_test/nonregr.py +0 -0
- data/tools/common/common/test/data/find_test/normal_file.txt +0 -0
- data/tools/common/common/test/data/find_test/spam.txt +0 -0
- data/tools/common/common/test/data/find_test/sub/doc.txt +0 -0
- data/tools/common/common/test/data/find_test/sub/momo.py +0 -0
- data/tools/common/common/test/data/find_test/test.ini +0 -0
- data/tools/common/common/test/data/find_test/test1.msg +0 -0
- data/tools/common/common/test/data/find_test/test2.msg +0 -0
- data/tools/common/common/test/data/find_test/write_protected_file.txt +0 -0
- data/tools/common/common/test/data/foo.txt +9 -0
- data/tools/common/common/test/data/module.py +88 -0
- data/tools/common/common/test/data/module2.py +77 -0
- data/tools/common/common/test/data/newlines.txt +3 -0
- data/tools/common/common/test/data/noendingnewline.py +36 -0
- data/tools/common/common/test/data/nonregr.py +14 -0
- data/tools/common/common/test/data/normal_file.txt +0 -0
- data/tools/common/common/test/data/reference_dir/NOTHING +0 -0
- data/tools/common/common/test/data/reference_dir/README +1 -0
- data/tools/common/common/test/data/reference_dir/subdir/coin +1 -0
- data/tools/common/common/test/data/reference_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/same_dir/NOTHING +0 -0
- data/tools/common/common/test/data/same_dir/README +1 -0
- data/tools/common/common/test/data/same_dir/subdir/coin +1 -0
- data/tools/common/common/test/data/same_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/spam.txt +9 -0
- data/tools/common/common/test/data/sub/doc.txt +1 -0
- data/tools/common/common/test/data/sub/momo.py +1 -0
- data/tools/common/common/test/data/subdir_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/subdir_differ_dir/README +1 -0
- data/tools/common/common/test/data/subdir_differ_dir/subdir/coin +1 -0
- data/tools/common/common/test/data/subdir_differ_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/test.ini +20 -0
- data/tools/common/common/test/data/test1.msg +30 -0
- data/tools/common/common/test/data/test2.msg +42 -0
- data/tools/common/common/test/data/write_protected_file.txt +0 -0
- data/tools/common/common/test/foomod.py +17 -0
- data/tools/common/common/test/unittest_cache.py +129 -0
- data/tools/common/common/test/unittest_changelog.py +37 -0
- data/tools/common/common/test/unittest_compat.py +239 -0
- data/tools/common/common/test/unittest_configuration.py +348 -0
- data/tools/common/common/test/unittest_date.py +154 -0
- data/tools/common/common/test/unittest_decorators.py +62 -0
- data/tools/common/common/test/unittest_deprecation.py +76 -0
- data/tools/common/common/test/unittest_fileutils.py +133 -0
- data/tools/common/common/test/unittest_graph.py +50 -0
- data/tools/common/common/test/unittest_html.py +76 -0
- data/tools/common/common/test/unittest_interface.py +87 -0
- data/tools/common/common/test/unittest_modutils.py +244 -0
- data/tools/common/common/test/unittest_pytest.py +50 -0
- data/tools/common/common/test/unittest_shellutils.py +248 -0
- data/tools/common/common/test/unittest_table.py +448 -0
- data/tools/common/common/test/unittest_taskqueue.py +71 -0
- data/tools/common/common/test/unittest_testlib.py +956 -0
- data/tools/common/common/test/unittest_textutils.py +247 -0
- data/tools/common/common/test/unittest_tree.py +248 -0
- data/tools/common/common/test/unittest_umessage.py +55 -0
- data/tools/common/common/test/unittest_ureports_html.py +64 -0
- data/tools/common/common/test/unittest_ureports_text.py +105 -0
- data/tools/common/common/test/unittest_xmlutils.py +75 -0
- data/tools/common/common/test/utils.py +87 -0
- data/tools/common/common/testlib.py +1927 -0
- data/tools/common/common/textutils.py +476 -0
- data/tools/common/common/tree.py +372 -0
- data/tools/common/common/umessage.py +161 -0
- data/tools/common/common/ureports/__init__.py +174 -0
- data/tools/common/common/ureports/docbook_writer.py +139 -0
- data/tools/common/common/ureports/html_writer.py +131 -0
- data/tools/common/common/ureports/nodes.py +201 -0
- data/tools/common/common/ureports/text_writer.py +140 -0
- data/tools/common/common/vcgutils.py +216 -0
- data/tools/common/common/visitor.py +107 -0
- data/tools/common/common/xmlrpcutils.py +136 -0
- data/tools/common/common/xmlutils.py +61 -0
- data/tools/compile/compile.py +16 -0
- data/tools/coverage/coverage.py +602 -0
- data/tools/epydoc/__init__.py +227 -0
- data/tools/epydoc/__init__.pyc +0 -0
- data/tools/epydoc/apidoc.py +2203 -0
- data/tools/epydoc/apidoc.pyc +0 -0
- data/tools/epydoc/checker.py +349 -0
- data/tools/epydoc/checker.pyc +0 -0
- data/tools/epydoc/cli.py +1470 -0
- data/tools/epydoc/cli.pyc +0 -0
- data/tools/epydoc/compat.py +250 -0
- data/tools/epydoc/compat.pyc +0 -0
- data/tools/epydoc/docbuilder.py +1358 -0
- data/tools/epydoc/docbuilder.pyc +0 -0
- data/tools/epydoc/docintrospecter.py +1056 -0
- data/tools/epydoc/docintrospecter.pyc +0 -0
- data/tools/epydoc/docparser.py +2113 -0
- data/tools/epydoc/docparser.pyc +0 -0
- data/tools/epydoc/docstringparser.py +1111 -0
- data/tools/epydoc/docstringparser.pyc +0 -0
- data/tools/epydoc/docwriter/__init__.py +12 -0
- data/tools/epydoc/docwriter/__init__.pyc +0 -0
- data/tools/epydoc/docwriter/dotgraph.py +1351 -0
- data/tools/epydoc/docwriter/dotgraph.pyc +0 -0
- data/tools/epydoc/docwriter/html.py +3491 -0
- data/tools/epydoc/docwriter/html.pyc +0 -0
- data/tools/epydoc/docwriter/html_colorize.py +909 -0
- data/tools/epydoc/docwriter/html_colorize.pyc +0 -0
- data/tools/epydoc/docwriter/html_css.py +550 -0
- data/tools/epydoc/docwriter/html_css.pyc +0 -0
- data/tools/epydoc/docwriter/html_help.py +190 -0
- data/tools/epydoc/docwriter/html_help.pyc +0 -0
- data/tools/epydoc/docwriter/latex.py +1187 -0
- data/tools/epydoc/docwriter/latex.pyc +0 -0
- data/tools/epydoc/docwriter/plaintext.py +276 -0
- data/tools/epydoc/docwriter/plaintext.pyc +0 -0
- data/tools/epydoc/docwriter/xlink.py +505 -0
- data/tools/epydoc/docwriter/xlink.pyc +0 -0
- data/tools/epydoc/gui.py +1148 -0
- data/tools/epydoc/gui.pyc +0 -0
- data/tools/epydoc/log.py +204 -0
- data/tools/epydoc/log.pyc +0 -0
- data/tools/epydoc/markup/__init__.py +623 -0
- data/tools/epydoc/markup/__init__.pyc +0 -0
- data/tools/epydoc/markup/doctest.py +311 -0
- data/tools/epydoc/markup/doctest.pyc +0 -0
- data/tools/epydoc/markup/epytext.py +2116 -0
- data/tools/epydoc/markup/epytext.pyc +0 -0
- data/tools/epydoc/markup/javadoc.py +250 -0
- data/tools/epydoc/markup/javadoc.pyc +0 -0
- data/tools/epydoc/markup/plaintext.py +78 -0
- data/tools/epydoc/markup/plaintext.pyc +0 -0
- data/tools/epydoc/markup/pyval_repr.py +532 -0
- data/tools/epydoc/markup/pyval_repr.pyc +0 -0
- data/tools/epydoc/markup/restructuredtext.py +906 -0
- data/tools/epydoc/markup/restructuredtext.pyc +0 -0
- data/tools/epydoc/test/__init__.py +97 -0
- data/tools/epydoc/test/__init__.pyc +0 -0
- data/tools/epydoc/test/util.py +226 -0
- data/tools/epydoc/test/util.pyc +0 -0
- data/tools/epydoc/util.py +289 -0
- data/tools/epydoc/util.pyc +0 -0
- data/tools/logilab/logilab/__init__.py +5 -0
- data/tools/logilab/logilab/astng/__init__.py +82 -0
- data/tools/logilab/logilab/astng/__pkginfo__.py +76 -0
- data/tools/logilab/logilab/astng/_exceptions.py +64 -0
- data/tools/logilab/logilab/astng/_nodes_ast.py +667 -0
- data/tools/logilab/logilab/astng/_nodes_compiler.py +758 -0
- data/tools/logilab/logilab/astng/bases.py +608 -0
- data/tools/logilab/logilab/astng/builder.py +239 -0
- data/tools/logilab/logilab/astng/inference.py +426 -0
- data/tools/logilab/logilab/astng/inspector.py +289 -0
- data/tools/logilab/logilab/astng/manager.py +421 -0
- data/tools/logilab/logilab/astng/mixins.py +165 -0
- data/tools/logilab/logilab/astng/node_classes.py +848 -0
- data/tools/logilab/logilab/astng/nodes.py +85 -0
- data/tools/logilab/logilab/astng/nodes_as_string.py +389 -0
- data/tools/logilab/logilab/astng/patchcomptransformer.py +159 -0
- data/tools/logilab/logilab/astng/protocols.py +333 -0
- data/tools/logilab/logilab/astng/raw_building.py +212 -0
- data/tools/logilab/logilab/astng/rebuilder.py +307 -0
- data/tools/logilab/logilab/astng/scoped_nodes.py +951 -0
- data/tools/logilab/logilab/astng/test/__init__.py +19 -0
- data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
- data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.zip +0 -0
- data/tools/logilab/logilab/astng/test/data/SSL1/Connection1.py +33 -0
- data/tools/logilab/logilab/astng/test/data/SSL1/__init__.py +20 -0
- data/tools/logilab/logilab/astng/test/data/__init__.py +20 -0
- data/tools/logilab/logilab/astng/test/data/all.py +29 -0
- data/tools/logilab/logilab/astng/test/data/appl/__init__.py +23 -0
- data/tools/logilab/logilab/astng/test/data/appl/myConnection.py +30 -0
- data/tools/logilab/logilab/astng/test/data/format.py +34 -0
- data/tools/logilab/logilab/astng/test/data/module.py +90 -0
- data/tools/logilab/logilab/astng/test/data/module2.py +112 -0
- data/tools/logilab/logilab/astng/test/data/noendingnewline.py +57 -0
- data/tools/logilab/logilab/astng/test/data/nonregr.py +76 -0
- data/tools/logilab/logilab/astng/test/data/notall.py +28 -0
- data/tools/logilab/logilab/astng/test/data2/__init__.py +20 -0
- data/tools/logilab/logilab/astng/test/data2/clientmodule_test.py +51 -0
- data/tools/logilab/logilab/astng/test/data2/suppliermodule_test.py +32 -0
- data/tools/logilab/logilab/astng/test/regrtest.py +135 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/absimport.py +22 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/descriptor_crash.py +31 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/import_package_subpackage_module.py +68 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/package/__init__.py +24 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/__init__.py +20 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/module.py +20 -0
- data/tools/logilab/logilab/astng/test/unittest_builder.py +684 -0
- data/tools/logilab/logilab/astng/test/unittest_inference.py +1112 -0
- data/tools/logilab/logilab/astng/test/unittest_inspector.py +105 -0
- data/tools/logilab/logilab/astng/test/unittest_lookup.py +302 -0
- data/tools/logilab/logilab/astng/test/unittest_manager.py +98 -0
- data/tools/logilab/logilab/astng/test/unittest_nodes.py +302 -0
- data/tools/logilab/logilab/astng/test/unittest_scoped_nodes.py +501 -0
- data/tools/logilab/logilab/astng/test/unittest_utils.py +104 -0
- data/tools/logilab/logilab/astng/utils.py +342 -0
- data/tools/logilab/logilab/common/__init__.py +140 -0
- data/tools/logilab/logilab/common/__pkginfo__.py +43 -0
- data/tools/logilab/logilab/common/adbh.py +35 -0
- data/tools/logilab/logilab/common/cache.py +114 -0
- data/tools/logilab/logilab/common/changelog.py +234 -0
- data/tools/logilab/logilab/common/clcommands.py +181 -0
- data/tools/logilab/logilab/common/cli.py +212 -0
- data/tools/logilab/logilab/common/compat.py +328 -0
- data/tools/logilab/logilab/common/configuration.py +1087 -0
- data/tools/logilab/logilab/common/contexts.py +58 -0
- data/tools/logilab/logilab/common/corbautils.py +117 -0
- data/tools/logilab/logilab/common/daemon.py +171 -0
- data/tools/logilab/logilab/common/date.py +279 -0
- data/tools/logilab/logilab/common/db.py +49 -0
- data/tools/logilab/logilab/common/dbf.py +229 -0
- data/tools/logilab/logilab/common/debugger.py +208 -0
- data/tools/logilab/logilab/common/decorators.py +190 -0
- data/tools/logilab/logilab/common/deprecation.py +118 -0
- data/tools/logilab/logilab/common/fileutils.py +409 -0
- data/tools/logilab/logilab/common/graph.py +259 -0
- data/tools/logilab/logilab/common/html.py +142 -0
- data/tools/logilab/logilab/common/interface.py +76 -0
- data/tools/logilab/logilab/common/logging_ext.py +166 -0
- data/tools/logilab/logilab/common/modutils.py +670 -0
- data/tools/logilab/logilab/common/optik_ext.py +383 -0
- data/tools/logilab/logilab/common/optparser.py +92 -0
- data/tools/logilab/logilab/common/pdf_ext.py +111 -0
- data/tools/logilab/logilab/common/proc.py +276 -0
- data/tools/logilab/logilab/common/pyro_ext.py +146 -0
- data/tools/logilab/logilab/common/pytest.py +754 -0
- data/tools/logilab/logilab/common/shellutils.py +383 -0
- data/tools/logilab/logilab/common/sphinx_ext.py +87 -0
- data/tools/logilab/logilab/common/sphinxutils.py +122 -0
- data/tools/logilab/logilab/common/sqlgen.py +31 -0
- data/tools/logilab/logilab/common/table.py +930 -0
- data/tools/logilab/logilab/common/tasksqueue.py +97 -0
- data/tools/logilab/logilab/common/test/__init__.py +1 -0
- data/tools/logilab/logilab/common/test/data/ChangeLog +184 -0
- data/tools/logilab/logilab/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
- data/tools/logilab/logilab/common/test/data/__init__.py +1 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/coin +1 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/__init__.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/foo.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/module.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/module2.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/newlines.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/noendingnewline.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/nonregr.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/normal_file.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/spam.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/sub/doc.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/sub/momo.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/test.ini +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/test1.msg +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/test2.msg +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/write_protected_file.txt +0 -0
- data/tools/logilab/logilab/common/test/data/foo.txt +9 -0
- data/tools/logilab/logilab/common/test/data/module.py +88 -0
- data/tools/logilab/logilab/common/test/data/module2.py +77 -0
- data/tools/logilab/logilab/common/test/data/newlines.txt +3 -0
- data/tools/logilab/logilab/common/test/data/noendingnewline.py +36 -0
- data/tools/logilab/logilab/common/test/data/nonregr.py +14 -0
- data/tools/logilab/logilab/common/test/data/normal_file.txt +0 -0
- data/tools/logilab/logilab/common/test/data/reference_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/reference_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/reference_dir/subdir/coin +1 -0
- data/tools/logilab/logilab/common/test/data/reference_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/same_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/same_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/same_dir/subdir/coin +1 -0
- data/tools/logilab/logilab/common/test/data/same_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/spam.txt +9 -0
- data/tools/logilab/logilab/common/test/data/sub/doc.txt +1 -0
- data/tools/logilab/logilab/common/test/data/sub/momo.py +1 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/coin +1 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/test.ini +20 -0
- data/tools/logilab/logilab/common/test/data/test1.msg +30 -0
- data/tools/logilab/logilab/common/test/data/test2.msg +42 -0
- data/tools/logilab/logilab/common/test/data/write_protected_file.txt +0 -0
- data/tools/logilab/logilab/common/test/foomod.py +17 -0
- data/tools/logilab/logilab/common/test/unittest_cache.py +129 -0
- data/tools/logilab/logilab/common/test/unittest_changelog.py +37 -0
- data/tools/logilab/logilab/common/test/unittest_compat.py +239 -0
- data/tools/logilab/logilab/common/test/unittest_configuration.py +348 -0
- data/tools/logilab/logilab/common/test/unittest_date.py +154 -0
- data/tools/logilab/logilab/common/test/unittest_decorators.py +62 -0
- data/tools/logilab/logilab/common/test/unittest_deprecation.py +76 -0
- data/tools/logilab/logilab/common/test/unittest_fileutils.py +133 -0
- data/tools/logilab/logilab/common/test/unittest_graph.py +50 -0
- data/tools/logilab/logilab/common/test/unittest_html.py +76 -0
- data/tools/logilab/logilab/common/test/unittest_interface.py +87 -0
- data/tools/logilab/logilab/common/test/unittest_modutils.py +244 -0
- data/tools/logilab/logilab/common/test/unittest_pytest.py +50 -0
- data/tools/logilab/logilab/common/test/unittest_shellutils.py +248 -0
- data/tools/logilab/logilab/common/test/unittest_table.py +448 -0
- data/tools/logilab/logilab/common/test/unittest_taskqueue.py +71 -0
- data/tools/logilab/logilab/common/test/unittest_testlib.py +956 -0
- data/tools/logilab/logilab/common/test/unittest_textutils.py +247 -0
- data/tools/logilab/logilab/common/test/unittest_tree.py +248 -0
- data/tools/logilab/logilab/common/test/unittest_umessage.py +55 -0
- data/tools/logilab/logilab/common/test/unittest_ureports_html.py +64 -0
- data/tools/logilab/logilab/common/test/unittest_ureports_text.py +105 -0
- data/tools/logilab/logilab/common/test/unittest_xmlutils.py +75 -0
- data/tools/logilab/logilab/common/test/utils.py +87 -0
- data/tools/logilab/logilab/common/testlib.py +1927 -0
- data/tools/logilab/logilab/common/textutils.py +476 -0
- data/tools/logilab/logilab/common/tree.py +372 -0
- data/tools/logilab/logilab/common/umessage.py +161 -0
- data/tools/logilab/logilab/common/ureports/__init__.py +174 -0
- data/tools/logilab/logilab/common/ureports/docbook_writer.py +139 -0
- data/tools/logilab/logilab/common/ureports/html_writer.py +131 -0
- data/tools/logilab/logilab/common/ureports/nodes.py +201 -0
- data/tools/logilab/logilab/common/ureports/text_writer.py +140 -0
- data/tools/logilab/logilab/common/vcgutils.py +216 -0
- data/tools/logilab/logilab/common/visitor.py +107 -0
- data/tools/logilab/logilab/common/xmlrpcutils.py +136 -0
- data/tools/logilab/logilab/common/xmlutils.py +61 -0
- data/tools/pychecker/COPYRIGHT +31 -0
- data/tools/pychecker/ChangeLog +349 -0
- data/tools/pychecker/CodeChecks.py +1969 -0
- data/tools/pychecker/CodeChecks.pyc +0 -0
- data/tools/pychecker/CodeChecks.pyo +0 -0
- data/tools/pychecker/Config.py +475 -0
- data/tools/pychecker/Config.pyc +0 -0
- data/tools/pychecker/Config.pyo +0 -0
- data/tools/pychecker/KNOWN_BUGS +100 -0
- data/tools/pychecker/MAINTAINERS +81 -0
- data/tools/pychecker/NEWS +406 -0
- data/tools/pychecker/OP.py +131 -0
- data/tools/pychecker/OP.pyc +0 -0
- data/tools/pychecker/OP.pyo +0 -0
- data/tools/pychecker/OptionTypes.py +117 -0
- data/tools/pychecker/OptionTypes.pyc +0 -0
- data/tools/pychecker/OptionTypes.pyo +0 -0
- data/tools/pychecker/README +152 -0
- data/tools/pychecker/Stack.py +115 -0
- data/tools/pychecker/Stack.pyc +0 -0
- data/tools/pychecker/Stack.pyo +0 -0
- data/tools/pychecker/TODO +101 -0
- data/tools/pychecker/VERSION +1 -0
- data/tools/pychecker/Warning.py +50 -0
- data/tools/pychecker/Warning.pyc +0 -0
- data/tools/pychecker/Warning.pyo +0 -0
- data/tools/pychecker/__init__.py +17 -0
- data/tools/pychecker/__init__.pyc +0 -0
- data/tools/pychecker/__init__.pyo +0 -0
- data/tools/pychecker/checker.py +961 -0
- data/tools/pychecker/checker.pyc +0 -0
- data/tools/pychecker/checker.pyo +0 -0
- data/tools/pychecker/function.py +159 -0
- data/tools/pychecker/function.pyc +0 -0
- data/tools/pychecker/function.pyo +0 -0
- data/tools/pychecker/msgs.py +175 -0
- data/tools/pychecker/msgs.pyc +0 -0
- data/tools/pychecker/msgs.pyo +0 -0
- data/tools/pychecker/options.py +275 -0
- data/tools/pychecker/options.pyc +0 -0
- data/tools/pychecker/options.pyo +0 -0
- data/tools/pychecker/pcmodules.py +19 -0
- data/tools/pychecker/pcmodules.pyc +0 -0
- data/tools/pychecker/pcmodules.pyo +0 -0
- data/tools/pychecker/printer.py +47 -0
- data/tools/pychecker/printer.pyc +0 -0
- data/tools/pychecker/printer.pyo +0 -0
- data/tools/pychecker/python.py +427 -0
- data/tools/pychecker/python.pyc +0 -0
- data/tools/pychecker/python.pyo +0 -0
- data/tools/pychecker/utils.py +102 -0
- data/tools/pychecker/utils.pyc +0 -0
- data/tools/pychecker/utils.pyo +0 -0
- data/tools/pychecker/warn.py +778 -0
- data/tools/pychecker/warn.pyc +0 -0
- data/tools/pychecker/warn.pyo +0 -0
- data/tools/pylint2/pylint/__init__.py +16 -0
- data/tools/pylint2/pylint/__pkginfo__.py +67 -0
- data/tools/pylint2/pylint/checkers/__init__.py +155 -0
- data/tools/pylint2/pylint/checkers/base.py +749 -0
- data/tools/pylint2/pylint/checkers/classes.py +527 -0
- data/tools/pylint2/pylint/checkers/design_analysis.py +344 -0
- data/tools/pylint2/pylint/checkers/exceptions.py +183 -0
- data/tools/pylint2/pylint/checkers/format.py +367 -0
- data/tools/pylint2/pylint/checkers/imports.py +379 -0
- data/tools/pylint2/pylint/checkers/logging.py +98 -0
- data/tools/pylint2/pylint/checkers/misc.py +128 -0
- data/tools/pylint2/pylint/checkers/newstyle.py +107 -0
- data/tools/pylint2/pylint/checkers/raw_metrics.py +125 -0
- data/tools/pylint2/pylint/checkers/similar.py +333 -0
- data/tools/pylint2/pylint/checkers/string_format.py +239 -0
- data/tools/pylint2/pylint/checkers/typecheck.py +364 -0
- data/tools/pylint2/pylint/checkers/utils.py +208 -0
- data/tools/pylint2/pylint/checkers/variables.py +498 -0
- data/tools/pylint2/pylint/config.py +149 -0
- data/tools/pylint2/pylint/epylint.py +149 -0
- data/tools/pylint2/pylint/gui.py +433 -0
- data/tools/pylint2/pylint/interfaces.py +98 -0
- data/tools/pylint2/pylint/lint.py +914 -0
- data/tools/pylint2/pylint/pyreverse/__init__.py +5 -0
- data/tools/pylint2/pylint/pyreverse/diadefslib.py +229 -0
- data/tools/pylint2/pylint/pyreverse/diagrams.py +247 -0
- data/tools/pylint2/pylint/pyreverse/main.py +123 -0
- data/tools/pylint2/pylint/pyreverse/utils.py +131 -0
- data/tools/pylint2/pylint/pyreverse/writer.py +196 -0
- data/tools/pylint2/pylint/reporters/__init__.py +67 -0
- data/tools/pylint2/pylint/reporters/guireporter.py +36 -0
- data/tools/pylint2/pylint/reporters/html.py +69 -0
- data/tools/pylint2/pylint/reporters/text.py +156 -0
- data/tools/pylint2/pylint/utils.py +518 -0
- data/tools/pylint2/pylint.py +16 -0
- data/tools/test/suite.py +35 -0
- metadata +566 -0
@@ -0,0 +1,229 @@
|
|
1
|
+
# Copyright (c) 2000-2010 LOGILAB S.A. (Paris, FRANCE).
|
2
|
+
# http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify it under
|
5
|
+
# the terms of the GNU General Public License as published by the Free Software
|
6
|
+
# Foundation; either version 2 of the License, or (at your option) any later
|
7
|
+
# version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
10
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
11
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along with
|
14
|
+
# this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
16
|
+
"""handle diagram generation options for class diagram or default diagrams
|
17
|
+
"""
|
18
|
+
|
19
|
+
from logilab import astng
|
20
|
+
from logilab.astng.utils import LocalsVisitor
|
21
|
+
|
22
|
+
from pylint.pyreverse.diagrams import PackageDiagram, ClassDiagram
|
23
|
+
|
24
|
+
# diagram generators ##########################################################
|
25
|
+
|
26
|
+
class DiaDefGenerator:
|
27
|
+
"""handle diagram generation options
|
28
|
+
"""
|
29
|
+
def __init__(self, linker, handler):
|
30
|
+
"""common Diagram Handler initialization"""
|
31
|
+
self.config = handler.config
|
32
|
+
self._set_default_options()
|
33
|
+
self.linker = linker
|
34
|
+
self.classdiagram = None # defined by subclasses
|
35
|
+
|
36
|
+
def get_title(self, node):
|
37
|
+
"""get title for objects"""
|
38
|
+
title = node.name
|
39
|
+
if self.module_names:
|
40
|
+
title = '%s.%s' % (node.root().name, title)
|
41
|
+
return title
|
42
|
+
|
43
|
+
def _set_option(self, option):
|
44
|
+
"""activate some options if not explicitly deactivated"""
|
45
|
+
# if we have a class diagram, we want more information by default;
|
46
|
+
# so if the option is None, we return True
|
47
|
+
if option is None:
|
48
|
+
if self.config.classes:
|
49
|
+
return True
|
50
|
+
else:
|
51
|
+
return False
|
52
|
+
return option
|
53
|
+
|
54
|
+
def _set_default_options(self):
|
55
|
+
"""set different default options with _default dictionary"""
|
56
|
+
self.module_names = self._set_option(self.config.module_names)
|
57
|
+
all_ancestors = self._set_option(self.config.all_ancestors)
|
58
|
+
all_associated = self._set_option(self.config.all_associated)
|
59
|
+
anc_level, ass_level = (0, 0)
|
60
|
+
if all_ancestors:
|
61
|
+
anc_level = -1
|
62
|
+
if all_associated:
|
63
|
+
ass_level = -1
|
64
|
+
if self.config.show_ancestors is not None:
|
65
|
+
anc_level = self.config.show_ancestors
|
66
|
+
if self.config.show_associated is not None:
|
67
|
+
ass_level = self.config.show_associated
|
68
|
+
self.anc_level, self.ass_level = anc_level, ass_level
|
69
|
+
|
70
|
+
def _get_levels(self):
|
71
|
+
"""help function for search levels"""
|
72
|
+
return self.anc_level, self.ass_level
|
73
|
+
|
74
|
+
def show_node(self, node):
|
75
|
+
"""true if builtins and not show_builtins"""
|
76
|
+
if self.config.show_builtin:
|
77
|
+
return True
|
78
|
+
return node.root().name != '__builtin__'
|
79
|
+
|
80
|
+
def add_class(self, node):
|
81
|
+
"""visit one class and add it to diagram"""
|
82
|
+
self.linker.visit(node)
|
83
|
+
self.classdiagram.add_object(self.get_title(node), node)
|
84
|
+
|
85
|
+
def get_ancestors(self, node, level):
|
86
|
+
"""return ancestor nodes of a class node"""
|
87
|
+
if level == 0:
|
88
|
+
return
|
89
|
+
for ancestor in node.ancestors(recurs=False):
|
90
|
+
if not self.show_node(ancestor):
|
91
|
+
continue
|
92
|
+
yield ancestor
|
93
|
+
|
94
|
+
def get_associated(self, klass_node, level):
|
95
|
+
"""return associated nodes of a class node"""
|
96
|
+
if level == 0:
|
97
|
+
return
|
98
|
+
for ass_nodes in klass_node.instance_attrs_type.values() + \
|
99
|
+
klass_node.locals_type.values():
|
100
|
+
for ass_node in ass_nodes:
|
101
|
+
if isinstance(ass_node, astng.Instance):
|
102
|
+
ass_node = ass_node._proxied
|
103
|
+
if not (isinstance(ass_node, astng.Class)
|
104
|
+
and self.show_node(ass_node)):
|
105
|
+
continue
|
106
|
+
yield ass_node
|
107
|
+
|
108
|
+
def extract_classes(self, klass_node, anc_level, ass_level):
|
109
|
+
"""extract recursively classes related to klass_node"""
|
110
|
+
if self.classdiagram.has_node(klass_node) or not self.show_node(klass_node):
|
111
|
+
return
|
112
|
+
self.add_class(klass_node)
|
113
|
+
|
114
|
+
for ancestor in self.get_ancestors(klass_node, anc_level):
|
115
|
+
self.extract_classes(ancestor, anc_level-1, ass_level)
|
116
|
+
|
117
|
+
for ass_node in self.get_associated(klass_node, ass_level):
|
118
|
+
self.extract_classes(ass_node, anc_level, ass_level-1)
|
119
|
+
|
120
|
+
|
121
|
+
class DefaultDiadefGenerator(LocalsVisitor, DiaDefGenerator):
|
122
|
+
"""generate minimum diagram definition for the project :
|
123
|
+
|
124
|
+
* a package diagram including project's modules
|
125
|
+
* a class diagram including project's classes
|
126
|
+
"""
|
127
|
+
|
128
|
+
def __init__(self, linker, handler):
|
129
|
+
DiaDefGenerator.__init__(self, linker, handler)
|
130
|
+
LocalsVisitor.__init__(self)
|
131
|
+
|
132
|
+
def visit_project(self, node):
|
133
|
+
"""visit an astng.Project node
|
134
|
+
|
135
|
+
create a diagram definition for packages
|
136
|
+
"""
|
137
|
+
mode = self.config.mode
|
138
|
+
if len(node.modules) > 1:
|
139
|
+
self.pkgdiagram = PackageDiagram('packages %s' % node.name, mode)
|
140
|
+
else:
|
141
|
+
self.pkgdiagram = None
|
142
|
+
self.classdiagram = ClassDiagram('classes %s' % node.name, mode)
|
143
|
+
|
144
|
+
def leave_project(self, node):
|
145
|
+
"""leave the astng.Project node
|
146
|
+
|
147
|
+
return the generated diagram definition
|
148
|
+
"""
|
149
|
+
if self.pkgdiagram:
|
150
|
+
return self.pkgdiagram, self.classdiagram
|
151
|
+
return self.classdiagram,
|
152
|
+
|
153
|
+
def visit_module(self, node):
|
154
|
+
"""visit an astng.Module node
|
155
|
+
|
156
|
+
add this class to the package diagram definition
|
157
|
+
"""
|
158
|
+
if self.pkgdiagram:
|
159
|
+
self.linker.visit(node)
|
160
|
+
self.pkgdiagram.add_object(node.name, node)
|
161
|
+
|
162
|
+
def visit_class(self, node):
|
163
|
+
"""visit an astng.Class node
|
164
|
+
|
165
|
+
add this class to the class diagram definition
|
166
|
+
"""
|
167
|
+
anc_level, ass_level = self._get_levels()
|
168
|
+
self.extract_classes(node, anc_level, ass_level)
|
169
|
+
|
170
|
+
def visit_from(self, node):
|
171
|
+
"""visit astng.From and catch modules for package diagram
|
172
|
+
"""
|
173
|
+
if self.pkgdiagram:
|
174
|
+
self.pkgdiagram.add_from_depend(node, node.modname)
|
175
|
+
|
176
|
+
|
177
|
+
class ClassDiadefGenerator(DiaDefGenerator):
|
178
|
+
"""generate a class diagram definition including all classes related to a
|
179
|
+
given class
|
180
|
+
"""
|
181
|
+
|
182
|
+
def __init__(self, linker, handler):
|
183
|
+
DiaDefGenerator.__init__(self, linker, handler)
|
184
|
+
|
185
|
+
def class_diagram(self, project, klass):
|
186
|
+
"""return a class diagram definition for the given klass and its
|
187
|
+
related klasses
|
188
|
+
"""
|
189
|
+
|
190
|
+
self.classdiagram = ClassDiagram(klass, self.config.mode)
|
191
|
+
if len(project.modules) > 1:
|
192
|
+
module, klass = klass.rsplit('.', 1)
|
193
|
+
module = project.get_module(module)
|
194
|
+
else:
|
195
|
+
module = project.modules[0]
|
196
|
+
klass = klass.split('.')[-1]
|
197
|
+
klass = module.ilookup(klass).next()
|
198
|
+
|
199
|
+
anc_level, ass_level = self._get_levels()
|
200
|
+
self.extract_classes(klass, anc_level, ass_level)
|
201
|
+
return self.classdiagram
|
202
|
+
|
203
|
+
# diagram handler #############################################################
|
204
|
+
|
205
|
+
class DiadefsHandler:
|
206
|
+
"""handle diagram definitions :
|
207
|
+
|
208
|
+
get it from user (i.e. xml files) or generate them
|
209
|
+
"""
|
210
|
+
|
211
|
+
def __init__(self, config):
|
212
|
+
self.config = config
|
213
|
+
|
214
|
+
def get_diadefs(self, project, linker):
|
215
|
+
"""get the diagrams configuration data
|
216
|
+
:param linker: astng.inspector.Linker(IdGeneratorMixIn, LocalsVisitor)
|
217
|
+
:param project: astng.manager.Project
|
218
|
+
"""
|
219
|
+
|
220
|
+
# read and interpret diagram definitions (Diadefs)
|
221
|
+
diagrams = []
|
222
|
+
generator = ClassDiadefGenerator(linker, self)
|
223
|
+
for klass in self.config.classes:
|
224
|
+
diagrams.append(generator.class_diagram(project, klass))
|
225
|
+
if not diagrams:
|
226
|
+
diagrams = DefaultDiadefGenerator(linker, self).visit(project)
|
227
|
+
for diagram in diagrams:
|
228
|
+
diagram.extract_relationships()
|
229
|
+
return diagrams
|
@@ -0,0 +1,247 @@
|
|
1
|
+
# Copyright (c) 2004-2010 LOGILAB S.A. (Paris, FRANCE).
|
2
|
+
# http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify it under
|
5
|
+
# the terms of the GNU General Public License as published by the Free Software
|
6
|
+
# Foundation; either version 2 of the License, or (at your option) any later
|
7
|
+
# version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
10
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
11
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along with
|
14
|
+
# this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
16
|
+
"""diagram objects
|
17
|
+
"""
|
18
|
+
|
19
|
+
from logilab import astng
|
20
|
+
from pylint.pyreverse.utils import is_interface, FilterMixIn
|
21
|
+
|
22
|
+
def set_counter(value):
|
23
|
+
"""Figure counter (re)set"""
|
24
|
+
Figure._UID_COUNT = value
|
25
|
+
|
26
|
+
class Figure:
|
27
|
+
"""base class for counter handling"""
|
28
|
+
_UID_COUNT = 0
|
29
|
+
def __init__(self):
|
30
|
+
Figure._UID_COUNT += 1
|
31
|
+
self.fig_id = Figure._UID_COUNT
|
32
|
+
|
33
|
+
class Relationship(Figure):
|
34
|
+
"""a relation ship from an object in the diagram to another
|
35
|
+
"""
|
36
|
+
def __init__(self, from_object, to_object, relation_type, name=None):
|
37
|
+
Figure.__init__(self)
|
38
|
+
self.from_object = from_object
|
39
|
+
self.to_object = to_object
|
40
|
+
self.type = relation_type
|
41
|
+
self.name = name
|
42
|
+
|
43
|
+
|
44
|
+
class DiagramEntity(Figure):
|
45
|
+
"""a diagram object, i.e. a label associated to an astng node
|
46
|
+
"""
|
47
|
+
def __init__(self, title='No name', node=None):
|
48
|
+
Figure.__init__(self)
|
49
|
+
self.title = title
|
50
|
+
self.node = node
|
51
|
+
|
52
|
+
class ClassDiagram(Figure, FilterMixIn):
|
53
|
+
"""main class diagram handling
|
54
|
+
"""
|
55
|
+
TYPE = 'class'
|
56
|
+
def __init__(self, title, mode):
|
57
|
+
FilterMixIn.__init__(self, mode)
|
58
|
+
Figure.__init__(self)
|
59
|
+
self.title = title
|
60
|
+
self.objects = []
|
61
|
+
self.relationships = {}
|
62
|
+
self._nodes = {}
|
63
|
+
self.depends = []
|
64
|
+
|
65
|
+
def add_relationship(self, from_object, to_object,
|
66
|
+
relation_type, name=None):
|
67
|
+
"""create a relation ship
|
68
|
+
"""
|
69
|
+
rel = Relationship(from_object, to_object, relation_type, name)
|
70
|
+
self.relationships.setdefault(relation_type, []).append(rel)
|
71
|
+
|
72
|
+
def get_relationship(self, from_object, relation_type):
|
73
|
+
"""return a relation ship or None
|
74
|
+
"""
|
75
|
+
for rel in self.relationships.get(relation_type, ()):
|
76
|
+
if rel.from_object is from_object:
|
77
|
+
return rel
|
78
|
+
raise KeyError(relation_type)
|
79
|
+
|
80
|
+
def get_attrs(self, node):
|
81
|
+
"""return visible attributes, possibly with class name"""
|
82
|
+
attrs = []
|
83
|
+
for node_name, ass_nodes in node.instance_attrs_type.items() + \
|
84
|
+
node.locals_type.items():
|
85
|
+
if not self.show_attr(node_name):
|
86
|
+
continue
|
87
|
+
names = self.class_names(ass_nodes)
|
88
|
+
if names:
|
89
|
+
node_name = "%s : %s" % (node_name, ", ".join(names))
|
90
|
+
attrs.append(node_name)
|
91
|
+
return attrs
|
92
|
+
|
93
|
+
def get_methods(self, node):
|
94
|
+
"""return visible methods"""
|
95
|
+
return [m for m in node.values()
|
96
|
+
if isinstance(m, astng.Function) and self.show_attr(m.name)]
|
97
|
+
|
98
|
+
def add_object(self, title, node):
|
99
|
+
"""create a diagram object
|
100
|
+
"""
|
101
|
+
assert not self._nodes.has_key(node)
|
102
|
+
ent = DiagramEntity(title, node)
|
103
|
+
self._nodes[node] = ent
|
104
|
+
self.objects.append(ent)
|
105
|
+
|
106
|
+
def class_names(self, nodes):
|
107
|
+
"""return class names if needed in diagram"""
|
108
|
+
names = []
|
109
|
+
for ass_node in nodes:
|
110
|
+
if isinstance(ass_node, astng.Instance):
|
111
|
+
ass_node = ass_node._proxied
|
112
|
+
if isinstance(ass_node, astng.Class) \
|
113
|
+
and hasattr(ass_node, "name") and not self.has_node(ass_node):
|
114
|
+
if ass_node.name not in names:
|
115
|
+
ass_name = ass_node.name
|
116
|
+
names.append(ass_name)
|
117
|
+
return names
|
118
|
+
|
119
|
+
def nodes(self):
|
120
|
+
"""return the list of underlying nodes
|
121
|
+
"""
|
122
|
+
return self._nodes.keys()
|
123
|
+
|
124
|
+
def has_node(self, node):
|
125
|
+
"""return true if the given node is included in the diagram
|
126
|
+
"""
|
127
|
+
return self._nodes.has_key(node)
|
128
|
+
|
129
|
+
def object_from_node(self, node):
|
130
|
+
"""return the diagram object mapped to node
|
131
|
+
"""
|
132
|
+
return self._nodes[node]
|
133
|
+
|
134
|
+
def classes(self):
|
135
|
+
"""return all class nodes in the diagram"""
|
136
|
+
return [o for o in self.objects if isinstance(o.node, astng.Class)]
|
137
|
+
|
138
|
+
def classe(self, name):
|
139
|
+
"""return a class by its name, raise KeyError if not found
|
140
|
+
"""
|
141
|
+
for klass in self.classes():
|
142
|
+
if klass.node.name == name:
|
143
|
+
return klass
|
144
|
+
raise KeyError(name)
|
145
|
+
|
146
|
+
def extract_relationships(self):
|
147
|
+
"""extract relation ships between nodes in the diagram
|
148
|
+
"""
|
149
|
+
for obj in self.classes():
|
150
|
+
node = obj.node
|
151
|
+
obj.attrs = self.get_attrs(node)
|
152
|
+
obj.methods = self.get_methods(node)
|
153
|
+
# shape
|
154
|
+
if is_interface(node):
|
155
|
+
obj.shape = 'interface'
|
156
|
+
else:
|
157
|
+
obj.shape = 'class'
|
158
|
+
# inheritance link
|
159
|
+
for par_node in node.ancestors(recurs=False):
|
160
|
+
try:
|
161
|
+
par_obj = self.object_from_node(par_node)
|
162
|
+
self.add_relationship(obj, par_obj, 'specialization')
|
163
|
+
except KeyError:
|
164
|
+
continue
|
165
|
+
# implements link
|
166
|
+
for impl_node in node.implements:
|
167
|
+
try:
|
168
|
+
impl_obj = self.object_from_node(impl_node)
|
169
|
+
self.add_relationship(obj, impl_obj, 'implements')
|
170
|
+
except KeyError:
|
171
|
+
continue
|
172
|
+
# associations link
|
173
|
+
for name, values in node.instance_attrs_type.items() + \
|
174
|
+
node.locals_type.items():
|
175
|
+
for value in values:
|
176
|
+
if value is astng.YES:
|
177
|
+
continue
|
178
|
+
if isinstance( value, astng.Instance):
|
179
|
+
value = value._proxied
|
180
|
+
try:
|
181
|
+
ass_obj = self.object_from_node(value)
|
182
|
+
self.add_relationship(ass_obj, obj, 'association', name)
|
183
|
+
except KeyError:
|
184
|
+
continue
|
185
|
+
|
186
|
+
|
187
|
+
class PackageDiagram(ClassDiagram):
|
188
|
+
"""package diagram handling
|
189
|
+
"""
|
190
|
+
TYPE = 'package'
|
191
|
+
|
192
|
+
def modules(self):
|
193
|
+
"""return all module nodes in the diagram"""
|
194
|
+
return [o for o in self.objects if isinstance(o.node, astng.Module)]
|
195
|
+
|
196
|
+
def module(self, name):
|
197
|
+
"""return a module by its name, raise KeyError if not found
|
198
|
+
"""
|
199
|
+
for mod in self.modules():
|
200
|
+
if mod.node.name == name:
|
201
|
+
return mod
|
202
|
+
raise KeyError(name)
|
203
|
+
|
204
|
+
def get_module(self, name, node):
|
205
|
+
"""return a module by its name, looking also for relative imports;
|
206
|
+
raise KeyError if not found
|
207
|
+
"""
|
208
|
+
for mod in self.modules():
|
209
|
+
mod_name = mod.node.name
|
210
|
+
if mod_name == name:
|
211
|
+
return mod
|
212
|
+
#search for fullname of relative import modules
|
213
|
+
package = node.root().name
|
214
|
+
if mod_name == "%s.%s" % (package, name):
|
215
|
+
return mod
|
216
|
+
if mod_name == "%s.%s" % (package.rsplit('.', 1)[0], name):
|
217
|
+
return mod
|
218
|
+
raise KeyError(name)
|
219
|
+
|
220
|
+
def add_from_depend(self, node, from_module):
|
221
|
+
"""add dependencies created by from-imports
|
222
|
+
"""
|
223
|
+
mod_name = node.root().name
|
224
|
+
obj = self.module( mod_name )
|
225
|
+
if from_module not in obj.node.depends:
|
226
|
+
obj.node.depends.append(from_module)
|
227
|
+
|
228
|
+
def extract_relationships(self):
|
229
|
+
"""extract relation ships between nodes in the diagram
|
230
|
+
"""
|
231
|
+
ClassDiagram.extract_relationships(self)
|
232
|
+
for obj in self.classes():
|
233
|
+
# ownership
|
234
|
+
try:
|
235
|
+
mod = self.object_from_node(obj.node.root())
|
236
|
+
self.add_relationship(obj, mod, 'ownership')
|
237
|
+
except KeyError:
|
238
|
+
continue
|
239
|
+
for obj in self.modules():
|
240
|
+
obj.shape = 'package'
|
241
|
+
# dependencies
|
242
|
+
for dep_name in obj.node.depends:
|
243
|
+
try:
|
244
|
+
dep = self.get_module(dep_name, obj.node)
|
245
|
+
except KeyError:
|
246
|
+
continue
|
247
|
+
self.add_relationship(obj, dep, 'depends')
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# # Copyright (c) 2000-2010 LOGILAB S.A. (Paris, FRANCE).
|
2
|
+
# http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify it under
|
5
|
+
# the terms of the GNU General Public License as published by the Free Software
|
6
|
+
# Foundation; either version 2 of the License, or (at your option) any later
|
7
|
+
# version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
10
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
11
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along with
|
14
|
+
# this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
16
|
+
"""
|
17
|
+
%prog [options] <packages>
|
18
|
+
|
19
|
+
create UML diagrams for classes and modules in <packages>
|
20
|
+
"""
|
21
|
+
|
22
|
+
import sys
|
23
|
+
from logilab.common.configuration import ConfigurationMixIn
|
24
|
+
from logilab.astng.manager import astng_wrapper, ASTNGManager
|
25
|
+
from logilab.astng.inspector import Linker
|
26
|
+
|
27
|
+
from pylint.pyreverse.diadefslib import DiadefsHandler
|
28
|
+
from pylint.pyreverse import writer
|
29
|
+
from pylint.pyreverse.utils import insert_default_options
|
30
|
+
|
31
|
+
OPTIONS = (
|
32
|
+
("filter-mode",
|
33
|
+
dict(short='f', default='PUB_ONLY', dest='mode', type='string',
|
34
|
+
action='store', metavar='<mode>',
|
35
|
+
help="""filter attributes and functions according to
|
36
|
+
<mode>. Correct modes are :
|
37
|
+
'PUB_ONLY' filter all non public attributes
|
38
|
+
[DEFAULT], equivalent to PRIVATE+SPECIAL_A
|
39
|
+
'ALL' no filter
|
40
|
+
'SPECIAL' filter Python special functions
|
41
|
+
except constructor
|
42
|
+
'OTHER' filter protected and private
|
43
|
+
attributes""")),
|
44
|
+
|
45
|
+
("class",
|
46
|
+
dict(short='c', action="append", metavar="<class>", dest="classes", default=[],
|
47
|
+
help="create a class diagram with all classes related to <class>;\
|
48
|
+
this uses by default the options -ASmy")),
|
49
|
+
|
50
|
+
("show-ancestors",
|
51
|
+
dict(short="a", action="store", metavar='<ancestor>', type='int',
|
52
|
+
help='show <ancestor> generations of ancestor classes not in <projects>')),
|
53
|
+
("all-ancestors",
|
54
|
+
dict(short="A", default=None,
|
55
|
+
help="show all ancestors off all classes in <projects>") ),
|
56
|
+
("show-associated",
|
57
|
+
dict(short='s', action="store", metavar='<ass_level>', type='int',
|
58
|
+
help='show <ass_level> levels of associated classes not in <projects>')),
|
59
|
+
("all-associated",
|
60
|
+
dict(short='S', default=None,
|
61
|
+
help='show recursively all associated off all associated classes')),
|
62
|
+
|
63
|
+
("show-builtin",
|
64
|
+
dict(short="b", action="store_true", default=False,
|
65
|
+
help='include builtin objects in representation of classes')),
|
66
|
+
|
67
|
+
("module-names",
|
68
|
+
dict(short="m", default=None, type='yn', metavar='[yn]',
|
69
|
+
help='include module name in representation of classes')),
|
70
|
+
# TODO : generate dependencies like in pylint
|
71
|
+
#("package-dependencies",
|
72
|
+
#dict(short="M", action="store", metavar='<package_depth>', type='int',
|
73
|
+
#help='show <package_depth> module dependencies beyond modules in \
|
74
|
+
#<projects> (for the package diagram)')),
|
75
|
+
("only-classnames",
|
76
|
+
dict(short='k', action="store_true", default=False,
|
77
|
+
help="don't show attributes and methods in the class boxes; \
|
78
|
+
this disables -f values")),
|
79
|
+
("output", dict(short="o", dest="output_format", action="store",
|
80
|
+
default="dot", metavar="<format>",
|
81
|
+
help="create a *.<format> output file if format available.")),
|
82
|
+
)
|
83
|
+
# FIXME : quiet mode
|
84
|
+
#( ('quiet',
|
85
|
+
#dict(help='run quietly', action='store_true', short='q')), )
|
86
|
+
|
87
|
+
|
88
|
+
class PyreverseCommand(ConfigurationMixIn):
|
89
|
+
"""base class providing common behaviour for pyreverse commands"""
|
90
|
+
|
91
|
+
options = OPTIONS
|
92
|
+
|
93
|
+
def __init__(self, args):
|
94
|
+
ConfigurationMixIn.__init__(self, usage=__doc__)
|
95
|
+
insert_default_options()
|
96
|
+
self.manager = ASTNGManager()
|
97
|
+
self.register_options_provider(self.manager)
|
98
|
+
args = self.load_command_line_configuration()
|
99
|
+
self.run(args)
|
100
|
+
|
101
|
+
def run(self, args):
|
102
|
+
"""checking arguments and run project"""
|
103
|
+
if not args:
|
104
|
+
print self.help()
|
105
|
+
return
|
106
|
+
project = self.manager.project_from_files(args, astng_wrapper)
|
107
|
+
linker = Linker(project, tag=True)
|
108
|
+
handler = DiadefsHandler(self.config)
|
109
|
+
diadefs = handler.get_diadefs(project, linker)
|
110
|
+
if self.config.output_format == "vcg":
|
111
|
+
writer.VCGWriter(self.config).write(diadefs)
|
112
|
+
else:
|
113
|
+
writer.DotWriter(self.config).write(diadefs)
|
114
|
+
|
115
|
+
|
116
|
+
class Run:
|
117
|
+
"""pyreverse main class"""
|
118
|
+
def __init__(self, args):
|
119
|
+
"""run pyreverse"""
|
120
|
+
PyreverseCommand(args)
|
121
|
+
|
122
|
+
if __name__ == '__main__':
|
123
|
+
Run(sys.argv[1:])
|