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,608 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# This program is free software; you can redistribute it and/or modify it under
|
3
|
+
# the terms of the GNU Lesser General Public License as published by the Free Software
|
4
|
+
# Foundation; either version 2 of the License, or (at your option) any later
|
5
|
+
# version.
|
6
|
+
#
|
7
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
8
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
9
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
10
|
+
#
|
11
|
+
# You should have received a copy of the GNU Lesser General Public License along with
|
12
|
+
# this program; if not, write to the Free Software Foundation, Inc.,
|
13
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
14
|
+
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
|
15
|
+
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
16
|
+
# copyright 2003-2010 Sylvain Thenault, all rights reserved.
|
17
|
+
# contact mailto:thenault@gmail.com
|
18
|
+
#
|
19
|
+
# This file is part of logilab-astng.
|
20
|
+
#
|
21
|
+
# logilab-astng is free software: you can redistribute it and/or modify it
|
22
|
+
# under the terms of the GNU Lesser General Public License as published by the
|
23
|
+
# Free Software Foundation, either version 2.1 of the License, or (at your
|
24
|
+
# option) any later version.
|
25
|
+
#
|
26
|
+
# logilab-astng is distributed in the hope that it will be useful, but
|
27
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
28
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
29
|
+
# for more details.
|
30
|
+
#
|
31
|
+
# You should have received a copy of the GNU Lesser General Public License along
|
32
|
+
# with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
|
33
|
+
|
34
|
+
"""This module contains base classes and functions for the nodes and some
|
35
|
+
inference utils.
|
36
|
+
|
37
|
+
"""
|
38
|
+
|
39
|
+
from __future__ import generators
|
40
|
+
|
41
|
+
__docformat__ = "restructuredtext en"
|
42
|
+
|
43
|
+
|
44
|
+
try:
|
45
|
+
from _ast import AST
|
46
|
+
del AST
|
47
|
+
class BaseClass(object):
|
48
|
+
pass
|
49
|
+
except ImportError:
|
50
|
+
class BaseClass:
|
51
|
+
pass
|
52
|
+
|
53
|
+
from logilab.common.compat import set
|
54
|
+
from logilab.astng._exceptions import (InferenceError, ASTNGError,
|
55
|
+
NotFoundError, UnresolvableName)
|
56
|
+
|
57
|
+
|
58
|
+
class Proxy(BaseClass):
|
59
|
+
"""a simple proxy object"""
|
60
|
+
_proxied = None
|
61
|
+
|
62
|
+
def __init__(self, proxied=None):
|
63
|
+
if proxied is not None:
|
64
|
+
self._proxied = proxied
|
65
|
+
|
66
|
+
def __getattr__(self, name):
|
67
|
+
if name == '_proxied':
|
68
|
+
return getattr(self.__class__, '_proxied')
|
69
|
+
if name in self.__dict__:
|
70
|
+
return self.__dict__[name]
|
71
|
+
return getattr(self._proxied, name)
|
72
|
+
|
73
|
+
def infer(self, context=None):
|
74
|
+
yield self
|
75
|
+
|
76
|
+
# Inference ##################################################################
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
class InferenceContext(object):
|
81
|
+
__slots__ = ('path', 'lookupname', 'callcontext', 'boundnode')
|
82
|
+
|
83
|
+
def __init__(self, path=None):
|
84
|
+
if path is None:
|
85
|
+
self.path = set()
|
86
|
+
else:
|
87
|
+
self.path = path
|
88
|
+
self.lookupname = None
|
89
|
+
self.callcontext = None
|
90
|
+
self.boundnode = None
|
91
|
+
|
92
|
+
def push(self, node):
|
93
|
+
name = self.lookupname
|
94
|
+
if (node, name) in self.path:
|
95
|
+
raise StopIteration()
|
96
|
+
self.path.add( (node, name) )
|
97
|
+
|
98
|
+
def clone(self):
|
99
|
+
# XXX copy lookupname/callcontext ?
|
100
|
+
clone = InferenceContext(self.path)
|
101
|
+
clone.callcontext = self.callcontext
|
102
|
+
clone.boundnode = self.boundnode
|
103
|
+
return clone
|
104
|
+
|
105
|
+
def copy_context(context):
|
106
|
+
if context is not None:
|
107
|
+
return context.clone()
|
108
|
+
else:
|
109
|
+
return InferenceContext()
|
110
|
+
|
111
|
+
|
112
|
+
def _infer_stmts(stmts, context, frame=None):
|
113
|
+
"""return an iterator on statements inferred by each statement in <stmts>
|
114
|
+
"""
|
115
|
+
stmt = None
|
116
|
+
infered = False
|
117
|
+
if context is not None:
|
118
|
+
name = context.lookupname
|
119
|
+
context = context.clone()
|
120
|
+
else:
|
121
|
+
name = None
|
122
|
+
context = InferenceContext()
|
123
|
+
for stmt in stmts:
|
124
|
+
if stmt is YES:
|
125
|
+
yield stmt
|
126
|
+
infered = True
|
127
|
+
continue
|
128
|
+
context.lookupname = stmt._infer_name(frame, name)
|
129
|
+
try:
|
130
|
+
for infered in stmt.infer(context):
|
131
|
+
yield infered
|
132
|
+
infered = True
|
133
|
+
except UnresolvableName:
|
134
|
+
continue
|
135
|
+
except InferenceError:
|
136
|
+
yield YES
|
137
|
+
infered = True
|
138
|
+
if not infered:
|
139
|
+
raise InferenceError(str(stmt))
|
140
|
+
|
141
|
+
|
142
|
+
# special inference objects (e.g. may be returned as nodes by .infer()) #######
|
143
|
+
|
144
|
+
class _Yes(object):
|
145
|
+
"""a yes object"""
|
146
|
+
def __repr__(self):
|
147
|
+
return 'YES'
|
148
|
+
def __getattribute__(self, name):
|
149
|
+
if name.startswith('__') and name.endswith('__'):
|
150
|
+
# to avoid inspection pb
|
151
|
+
return super(_Yes, self).__getattribute__(name)
|
152
|
+
return self
|
153
|
+
def __call__(self, *args, **kwargs):
|
154
|
+
return self
|
155
|
+
|
156
|
+
|
157
|
+
YES = _Yes()
|
158
|
+
|
159
|
+
|
160
|
+
class Instance(Proxy):
|
161
|
+
"""a special node representing a class instance"""
|
162
|
+
def getattr(self, name, context=None, lookupclass=True):
|
163
|
+
try:
|
164
|
+
values = self._proxied.instance_attr(name, context)
|
165
|
+
except NotFoundError:
|
166
|
+
if name == '__class__':
|
167
|
+
return [self._proxied]
|
168
|
+
if lookupclass:
|
169
|
+
# class attributes not available through the instance
|
170
|
+
# unless they are explicitly defined
|
171
|
+
if name in ('__name__', '__bases__', '__mro__'):
|
172
|
+
return self._proxied.local_attr(name)
|
173
|
+
return self._proxied.getattr(name, context)
|
174
|
+
raise NotFoundError(name)
|
175
|
+
# since we've no context information, return matching class members as
|
176
|
+
# well
|
177
|
+
if lookupclass:
|
178
|
+
try:
|
179
|
+
return values + self._proxied.getattr(name, context)
|
180
|
+
except NotFoundError:
|
181
|
+
pass
|
182
|
+
return values
|
183
|
+
|
184
|
+
def igetattr(self, name, context=None):
|
185
|
+
"""inferred getattr"""
|
186
|
+
try:
|
187
|
+
# XXX frame should be self._proxied, or not ?
|
188
|
+
get_attr = self.getattr(name, context, lookupclass=False)
|
189
|
+
return _infer_stmts(self._wrap_attr(get_attr, context), context,
|
190
|
+
frame=self)
|
191
|
+
except NotFoundError:
|
192
|
+
try:
|
193
|
+
# fallback to class'igetattr since it has some logic to handle
|
194
|
+
# descriptors
|
195
|
+
return self._wrap_attr(self._proxied.igetattr(name, context),
|
196
|
+
context)
|
197
|
+
except NotFoundError:
|
198
|
+
raise InferenceError(name)
|
199
|
+
|
200
|
+
def _wrap_attr(self, attrs, context=None):
|
201
|
+
"""wrap bound methods of attrs in a InstanceMethod proxies"""
|
202
|
+
for attr in attrs:
|
203
|
+
if isinstance(attr, UnboundMethod):
|
204
|
+
if '__builtin__.property' in attr.decoratornames():
|
205
|
+
for infered in attr.infer_call_result(self, context):
|
206
|
+
yield infered
|
207
|
+
else:
|
208
|
+
yield BoundMethod(attr, self)
|
209
|
+
else:
|
210
|
+
yield attr
|
211
|
+
|
212
|
+
def infer_call_result(self, caller, context=None):
|
213
|
+
"""infer what a class instance is returning when called"""
|
214
|
+
infered = False
|
215
|
+
for node in self._proxied.igetattr('__call__', context):
|
216
|
+
for res in node.infer_call_result(caller, context):
|
217
|
+
infered = True
|
218
|
+
yield res
|
219
|
+
if not infered:
|
220
|
+
raise InferenceError()
|
221
|
+
|
222
|
+
def __repr__(self):
|
223
|
+
return '<Instance of %s.%s at 0x%s>' % (self._proxied.root().name,
|
224
|
+
self._proxied.name,
|
225
|
+
id(self))
|
226
|
+
def __str__(self):
|
227
|
+
return 'Instance of %s.%s' % (self._proxied.root().name,
|
228
|
+
self._proxied.name)
|
229
|
+
|
230
|
+
def callable(self):
|
231
|
+
try:
|
232
|
+
self._proxied.getattr('__call__')
|
233
|
+
return True
|
234
|
+
except NotFoundError:
|
235
|
+
return False
|
236
|
+
|
237
|
+
def pytype(self):
|
238
|
+
return self._proxied.qname()
|
239
|
+
|
240
|
+
def display_type(self):
|
241
|
+
return 'Instance of'
|
242
|
+
|
243
|
+
|
244
|
+
class UnboundMethod(Proxy):
|
245
|
+
"""a special node representing a method not bound to an instance"""
|
246
|
+
def __repr__(self):
|
247
|
+
frame = self._proxied.parent.frame()
|
248
|
+
return '<%s %s of %s at 0x%s' % (self.__class__.__name__,
|
249
|
+
self._proxied.name,
|
250
|
+
frame.qname(), id(self))
|
251
|
+
|
252
|
+
def is_bound(self):
|
253
|
+
return False
|
254
|
+
|
255
|
+
def getattr(self, name, context=None):
|
256
|
+
if name == 'im_func':
|
257
|
+
return [self._proxied]
|
258
|
+
return super(UnboundMethod, self).getattr(name, context)
|
259
|
+
|
260
|
+
def igetattr(self, name, context=None):
|
261
|
+
if name == 'im_func':
|
262
|
+
return iter((self._proxied,))
|
263
|
+
return super(UnboundMethod, self).igetattr(name, context)
|
264
|
+
|
265
|
+
|
266
|
+
class BoundMethod(UnboundMethod):
|
267
|
+
"""a special node representing a method bound to an instance"""
|
268
|
+
def __init__(self, proxy, bound):
|
269
|
+
UnboundMethod.__init__(self, proxy)
|
270
|
+
self.bound = bound
|
271
|
+
|
272
|
+
def is_bound(self):
|
273
|
+
return True
|
274
|
+
|
275
|
+
def infer_call_result(self, caller, context):
|
276
|
+
context = context.clone()
|
277
|
+
context.boundnode = self.bound
|
278
|
+
return self._proxied.infer_call_result(caller, context)
|
279
|
+
|
280
|
+
|
281
|
+
class Generator(Proxy):
|
282
|
+
"""a special node representing a generator"""
|
283
|
+
def callable(self):
|
284
|
+
return True
|
285
|
+
|
286
|
+
def pytype(self):
|
287
|
+
return '__builtin__.generator'
|
288
|
+
|
289
|
+
def display_type(self):
|
290
|
+
return 'Generator'
|
291
|
+
|
292
|
+
|
293
|
+
# decorators ##################################################################
|
294
|
+
|
295
|
+
def path_wrapper(func):
|
296
|
+
"""return the given infer function wrapped to handle the path"""
|
297
|
+
def wrapped(node, context=None, _func=func, **kwargs):
|
298
|
+
"""wrapper function handling context"""
|
299
|
+
if context is None:
|
300
|
+
context = InferenceContext()
|
301
|
+
context.push(node)
|
302
|
+
yielded = set()
|
303
|
+
for res in _func(node, context, **kwargs):
|
304
|
+
# unproxy only true instance, not const, tuple, dict...
|
305
|
+
if res.__class__ is Instance:
|
306
|
+
ares = res._proxied
|
307
|
+
else:
|
308
|
+
ares = res
|
309
|
+
if not ares in yielded:
|
310
|
+
yield res
|
311
|
+
yielded.add(ares)
|
312
|
+
return wrapped
|
313
|
+
|
314
|
+
def yes_if_nothing_infered(func):
|
315
|
+
def wrapper(*args, **kwargs):
|
316
|
+
infered = False
|
317
|
+
for node in func(*args, **kwargs):
|
318
|
+
infered = True
|
319
|
+
yield node
|
320
|
+
if not infered:
|
321
|
+
yield YES
|
322
|
+
return wrapper
|
323
|
+
|
324
|
+
def raise_if_nothing_infered(func):
|
325
|
+
def wrapper(*args, **kwargs):
|
326
|
+
infered = False
|
327
|
+
for node in func(*args, **kwargs):
|
328
|
+
infered = True
|
329
|
+
yield node
|
330
|
+
if not infered:
|
331
|
+
raise InferenceError()
|
332
|
+
return wrapper
|
333
|
+
|
334
|
+
|
335
|
+
# Node ######################################################################
|
336
|
+
|
337
|
+
class NodeNG(BaseClass):
|
338
|
+
"""Base Class for all ASTNG node classes.
|
339
|
+
|
340
|
+
It represents a node of the new abstract syntax tree.
|
341
|
+
"""
|
342
|
+
is_statement = False
|
343
|
+
# attributes below are set by the builder module or by raw factories
|
344
|
+
lineno = None
|
345
|
+
fromlineno = None
|
346
|
+
tolineno = None
|
347
|
+
# parent node in the tree
|
348
|
+
parent = None
|
349
|
+
# attributes containing child node(s) redefined in most concrete classes:
|
350
|
+
_astng_fields = ()
|
351
|
+
|
352
|
+
def _repr_name(self):
|
353
|
+
"""return self.name or self.attrname or '' for nice representation"""
|
354
|
+
return getattr(self, 'name', getattr(self, 'attrname', ''))
|
355
|
+
|
356
|
+
def __str__(self):
|
357
|
+
return '%s(%s)' % (self.__class__.__name__, self._repr_name())
|
358
|
+
|
359
|
+
def __repr__(self):
|
360
|
+
return '<%s(%s) l.%s [%s] at Ox%x>' % (self.__class__.__name__,
|
361
|
+
self._repr_name(),
|
362
|
+
self.fromlineno,
|
363
|
+
self.root().name,
|
364
|
+
id(self))
|
365
|
+
|
366
|
+
|
367
|
+
def accept(self, visitor):
|
368
|
+
klass = self.__class__.__name__
|
369
|
+
func = getattr(visitor, "visit_" + self.__class__.__name__.lower())
|
370
|
+
return func(self)
|
371
|
+
|
372
|
+
def get_children(self):
|
373
|
+
node_dict = self.__dict__
|
374
|
+
for field in self._astng_fields:
|
375
|
+
attr = node_dict[field]
|
376
|
+
if attr is None:
|
377
|
+
continue
|
378
|
+
if isinstance(attr, (list, tuple)):
|
379
|
+
for elt in attr:
|
380
|
+
yield elt
|
381
|
+
else:
|
382
|
+
yield attr
|
383
|
+
|
384
|
+
def last_child(self):
|
385
|
+
"""an optimized version of list(get_children())[-1]"""
|
386
|
+
n_dict = self.__dict__
|
387
|
+
for field in self._astng_fields[::-1]:
|
388
|
+
attr = n_dict[field]
|
389
|
+
if not attr: # None or empty listy / tuple
|
390
|
+
continue
|
391
|
+
if isinstance(attr, (list, tuple)):
|
392
|
+
return attr[-1]
|
393
|
+
else:
|
394
|
+
return attr
|
395
|
+
return None
|
396
|
+
|
397
|
+
def parent_of(self, node):
|
398
|
+
"""return true if i'm a parent of the given node"""
|
399
|
+
parent = node.parent
|
400
|
+
while parent is not None:
|
401
|
+
if self is parent:
|
402
|
+
return True
|
403
|
+
parent = parent.parent
|
404
|
+
return False
|
405
|
+
|
406
|
+
def statement(self):
|
407
|
+
"""return the first parent node marked as statement node"""
|
408
|
+
if self.is_statement:
|
409
|
+
return self
|
410
|
+
return self.parent.statement()
|
411
|
+
|
412
|
+
def frame(self):
|
413
|
+
"""return the first parent frame node (i.e. Module, Function or Class)
|
414
|
+
"""
|
415
|
+
return self.parent.frame()
|
416
|
+
|
417
|
+
def scope(self):
|
418
|
+
"""return the first node defining a new scope (i.e. Module, Function,
|
419
|
+
Class, Lambda but also GenExpr)
|
420
|
+
"""
|
421
|
+
return self.parent.scope()
|
422
|
+
|
423
|
+
def root(self):
|
424
|
+
"""return the root node of the tree, (i.e. a Module)"""
|
425
|
+
if self.parent:
|
426
|
+
return self.parent.root()
|
427
|
+
return self
|
428
|
+
|
429
|
+
def child_sequence(self, child):
|
430
|
+
"""search for the right sequence where the child lies in"""
|
431
|
+
for field in self._astng_fields:
|
432
|
+
node_or_sequence = getattr(self, field)
|
433
|
+
if node_or_sequence is child:
|
434
|
+
return [node_or_sequence]
|
435
|
+
# /!\ compiler.ast Nodes have an __iter__ walking over child nodes
|
436
|
+
if isinstance(node_or_sequence, (tuple, list)) and child in node_or_sequence:
|
437
|
+
return node_or_sequence
|
438
|
+
else:
|
439
|
+
msg = 'Could not found %s in %s\'s children'
|
440
|
+
raise ASTNGError(msg % (repr(child), repr(self)))
|
441
|
+
|
442
|
+
def locate_child(self, child):
|
443
|
+
"""return a 2-uple (child attribute name, sequence or node)"""
|
444
|
+
for field in self._astng_fields:
|
445
|
+
node_or_sequence = getattr(self, field)
|
446
|
+
# /!\ compiler.ast Nodes have an __iter__ walking over child nodes
|
447
|
+
if child is node_or_sequence:
|
448
|
+
return field, child
|
449
|
+
if isinstance(node_or_sequence, (tuple, list)) and child in node_or_sequence:
|
450
|
+
return field, node_or_sequence
|
451
|
+
msg = 'Could not found %s in %s\'s children'
|
452
|
+
raise ASTNGError(msg % (repr(child), repr(self)))
|
453
|
+
# FIXME : should we merge child_sequence and locate_child ? locate_child
|
454
|
+
# is only used in are_exclusive, child_sequence one time in pylint.
|
455
|
+
|
456
|
+
def next_sibling(self):
|
457
|
+
"""return the next sibling statement"""
|
458
|
+
return self.parent.next_sibling()
|
459
|
+
|
460
|
+
def previous_sibling(self):
|
461
|
+
"""return the previous sibling statement"""
|
462
|
+
return self.parent.previous_sibling()
|
463
|
+
|
464
|
+
def nearest(self, nodes):
|
465
|
+
"""return the node which is the nearest before this one in the
|
466
|
+
given list of nodes
|
467
|
+
"""
|
468
|
+
myroot = self.root()
|
469
|
+
mylineno = self.fromlineno
|
470
|
+
nearest = None, 0
|
471
|
+
for node in nodes:
|
472
|
+
assert node.root() is myroot, \
|
473
|
+
'nodes %s and %s are not from the same module' % (self, node)
|
474
|
+
lineno = node.fromlineno
|
475
|
+
if node.fromlineno > mylineno:
|
476
|
+
break
|
477
|
+
if lineno > nearest[1]:
|
478
|
+
nearest = node, lineno
|
479
|
+
# FIXME: raise an exception if nearest is None ?
|
480
|
+
return nearest[0]
|
481
|
+
|
482
|
+
def set_line_info(self, lastchild):
|
483
|
+
if self.lineno is None:
|
484
|
+
self.fromlineno = self._fixed_source_line()
|
485
|
+
else:
|
486
|
+
self.fromlineno = self.lineno
|
487
|
+
if lastchild is None:
|
488
|
+
self.tolineno = self.fromlineno
|
489
|
+
else:
|
490
|
+
self.tolineno = lastchild.tolineno
|
491
|
+
return
|
492
|
+
# TODO / FIXME:
|
493
|
+
assert self.fromlineno is not None, self
|
494
|
+
assert self.tolineno is not None, self
|
495
|
+
|
496
|
+
def _fixed_source_line(self):
|
497
|
+
"""return the line number where the given node appears
|
498
|
+
|
499
|
+
we need this method since not all nodes have the lineno attribute
|
500
|
+
correctly set...
|
501
|
+
"""
|
502
|
+
line = self.lineno
|
503
|
+
_node = self
|
504
|
+
try:
|
505
|
+
while line is None:
|
506
|
+
_node = _node.get_children().next()
|
507
|
+
line = _node.lineno
|
508
|
+
except StopIteration:
|
509
|
+
_node = self.parent
|
510
|
+
while _node and line is None:
|
511
|
+
line = _node.lineno
|
512
|
+
_node = _node.parent
|
513
|
+
return line
|
514
|
+
|
515
|
+
def block_range(self, lineno):
|
516
|
+
"""handle block line numbers range for non block opening statements
|
517
|
+
"""
|
518
|
+
return lineno, self.tolineno
|
519
|
+
|
520
|
+
def set_local(self, name, stmt):
|
521
|
+
"""delegate to a scoped parent handling a locals dictionary"""
|
522
|
+
self.parent.set_local(name, stmt)
|
523
|
+
|
524
|
+
def nodes_of_class(self, klass, skip_klass=None):
|
525
|
+
"""return an iterator on nodes which are instance of the given class(es)
|
526
|
+
|
527
|
+
klass may be a class object or a tuple of class objects
|
528
|
+
"""
|
529
|
+
if isinstance(self, klass):
|
530
|
+
yield self
|
531
|
+
for child_node in self.get_children():
|
532
|
+
if skip_klass is not None and isinstance(child_node, skip_klass):
|
533
|
+
continue
|
534
|
+
for matching in child_node.nodes_of_class(klass, skip_klass):
|
535
|
+
yield matching
|
536
|
+
|
537
|
+
def _infer_name(self, frame, name):
|
538
|
+
# overridden for From, Import, Global, TryExcept and Arguments
|
539
|
+
return None
|
540
|
+
|
541
|
+
def infer(self, context=None):
|
542
|
+
"""we don't know how to resolve a statement by default"""
|
543
|
+
# this method is overridden by most concrete classes
|
544
|
+
raise InferenceError(self.__class__.__name__)
|
545
|
+
|
546
|
+
def infered(self):
|
547
|
+
'''return list of infered values for a more simple inference usage'''
|
548
|
+
return list(self.infer())
|
549
|
+
|
550
|
+
def instanciate_class(self):
|
551
|
+
"""instanciate a node if it is a Class node, else return self"""
|
552
|
+
return self
|
553
|
+
|
554
|
+
def has_base(self, node):
|
555
|
+
return False
|
556
|
+
|
557
|
+
def callable(self):
|
558
|
+
return False
|
559
|
+
|
560
|
+
def eq(self, value):
|
561
|
+
return False
|
562
|
+
|
563
|
+
def as_string(self):
|
564
|
+
from logilab.astng.nodes_as_string import as_string
|
565
|
+
return as_string(self)
|
566
|
+
|
567
|
+
def repr_tree(self, ids=False):
|
568
|
+
"""print a nice astng tree representation"""
|
569
|
+
result = []
|
570
|
+
_repr_tree(self, result, ids=ids)
|
571
|
+
print "\n".join(result)
|
572
|
+
|
573
|
+
|
574
|
+
INDENT = " "
|
575
|
+
|
576
|
+
def _repr_tree(node, result, indent='', _done=None, ids=False):
|
577
|
+
"""built a tree representation of a node as a list of lines"""
|
578
|
+
if _done is None:
|
579
|
+
_done = set()
|
580
|
+
if not hasattr(node, '_astng_fields'): # not a astng node
|
581
|
+
return
|
582
|
+
if node in _done:
|
583
|
+
result.append( indent + 'loop in tree: %s' % node )
|
584
|
+
return
|
585
|
+
_done.add(node)
|
586
|
+
node_str = str(node)
|
587
|
+
if ids:
|
588
|
+
node_str += ' . \t%x' % id(node)
|
589
|
+
result.append( indent + node_str )
|
590
|
+
indent += INDENT
|
591
|
+
for field in node._astng_fields:
|
592
|
+
value = getattr(node, field)
|
593
|
+
if isinstance(value, (list, tuple) ):
|
594
|
+
result.append( indent + field + " = [" )
|
595
|
+
for child in value:
|
596
|
+
if isinstance(child, (list, tuple) ):
|
597
|
+
# special case for Dict # FIXME
|
598
|
+
_repr_tree(child[0], result, indent, _done, ids)
|
599
|
+
_repr_tree(child[1], result, indent, _done, ids)
|
600
|
+
result.append(indent + ',')
|
601
|
+
else:
|
602
|
+
_repr_tree(child, result, indent, _done, ids)
|
603
|
+
result.append( indent + "]" )
|
604
|
+
else:
|
605
|
+
result.append( indent + field + " = " )
|
606
|
+
_repr_tree(value, result, indent, _done, ids)
|
607
|
+
|
608
|
+
|