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,239 @@
|
|
1
|
+
# This program is free software; you can redistribute it and/or modify it under
|
2
|
+
# the terms of the GNU Lesser General Public License as published by the Free Software
|
3
|
+
# Foundation; either version 2 of the License, or (at your option) any later
|
4
|
+
# version.
|
5
|
+
#
|
6
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
7
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
8
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
9
|
+
#
|
10
|
+
# You should have received a copy of the GNU Lesser General Public License along with
|
11
|
+
# this program; if not, write to the Free Software Foundation, Inc.,
|
12
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
13
|
+
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
|
14
|
+
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
15
|
+
# copyright 2003-2010 Sylvain Thenault, all rights reserved.
|
16
|
+
# contact mailto:thenault@gmail.com
|
17
|
+
#
|
18
|
+
# This file is part of logilab-astng.
|
19
|
+
#
|
20
|
+
# logilab-astng is free software: you can redistribute it and/or modify it
|
21
|
+
# under the terms of the GNU Lesser General Public License as published by the
|
22
|
+
# Free Software Foundation, either version 2.1 of the License, or (at your
|
23
|
+
# option) any later version.
|
24
|
+
#
|
25
|
+
# logilab-astng is distributed in the hope that it will be useful, but
|
26
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
27
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
28
|
+
# for more details.
|
29
|
+
#
|
30
|
+
# You should have received a copy of the GNU Lesser General Public License along
|
31
|
+
# with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
|
32
|
+
"""The ASTNGBuilder makes astng from living object and / or from compiler.ast
|
33
|
+
|
34
|
+
With python >= 2.5, the internal _ast module is used instead
|
35
|
+
|
36
|
+
The builder is not thread safe and can't be used to parse different sources
|
37
|
+
at the same time.
|
38
|
+
|
39
|
+
|
40
|
+
"""
|
41
|
+
|
42
|
+
__docformat__ = "restructuredtext en"
|
43
|
+
|
44
|
+
import sys
|
45
|
+
from os.path import splitext, basename, dirname, exists, abspath
|
46
|
+
from inspect import isfunction, ismethod, ismethoddescriptor, isclass, \
|
47
|
+
isbuiltin
|
48
|
+
from inspect import isdatadescriptor
|
49
|
+
|
50
|
+
from logilab.common.fileutils import norm_read
|
51
|
+
from logilab.common.modutils import modpath_from_file
|
52
|
+
|
53
|
+
from logilab.astng._exceptions import ASTNGBuildingException
|
54
|
+
from logilab.astng.raw_building import *
|
55
|
+
|
56
|
+
try:
|
57
|
+
from _ast import PyCF_ONLY_AST
|
58
|
+
def parse(string):
|
59
|
+
return compile(string, "<string>", 'exec', PyCF_ONLY_AST)
|
60
|
+
from logilab.astng._nodes_ast import TreeRebuilder
|
61
|
+
except ImportError, exc:
|
62
|
+
from compiler import parse
|
63
|
+
from logilab.astng import patchcomptransformer
|
64
|
+
from logilab.astng._nodes_compiler import TreeRebuilder
|
65
|
+
|
66
|
+
# ast NG builder ##############################################################
|
67
|
+
|
68
|
+
class ASTNGBuilder:
|
69
|
+
"""provide astng building methods
|
70
|
+
"""
|
71
|
+
|
72
|
+
def __init__(self, manager=None):
|
73
|
+
if manager is None:
|
74
|
+
from logilab.astng import MANAGER as manager
|
75
|
+
self._manager = manager
|
76
|
+
self._module = None
|
77
|
+
self._file = None
|
78
|
+
self._done = None
|
79
|
+
self.rebuilder = TreeRebuilder(manager)
|
80
|
+
self._dyn_modname_map = {'gtk': 'gtk._gtk'}
|
81
|
+
|
82
|
+
def module_build(self, module, modname=None):
|
83
|
+
"""build an astng from a living module instance
|
84
|
+
"""
|
85
|
+
node = None
|
86
|
+
self._module = module
|
87
|
+
path = getattr(module, '__file__', None)
|
88
|
+
if path is not None:
|
89
|
+
path_, ext = splitext(module.__file__)
|
90
|
+
if ext in ('.py', '.pyc', '.pyo') and exists(path_ + '.py'):
|
91
|
+
node = self.file_build(path_ + '.py', modname)
|
92
|
+
if node is None:
|
93
|
+
# this is a built-in module
|
94
|
+
# get a partial representation by introspection
|
95
|
+
node = self.inspect_build(module, modname=modname, path=path)
|
96
|
+
return node
|
97
|
+
|
98
|
+
def inspect_build(self, module, modname=None, path=None):
|
99
|
+
"""build astng from a living module (i.e. using inspect)
|
100
|
+
this is used when there is no python source code available (either
|
101
|
+
because it's a built-in module or because the .py is not available)
|
102
|
+
"""
|
103
|
+
self._module = module
|
104
|
+
if modname is None:
|
105
|
+
modname = module.__name__
|
106
|
+
node = build_module(modname, module.__doc__)
|
107
|
+
node.file = node.path = path and abspath(path) or path
|
108
|
+
if self._manager is not None:
|
109
|
+
self._manager._cache[modname] = node
|
110
|
+
node.package = hasattr(module, '__path__')
|
111
|
+
self._done = {}
|
112
|
+
self.object_build(node, module)
|
113
|
+
return node
|
114
|
+
|
115
|
+
def file_build(self, path, modname=None):
|
116
|
+
"""build astng from a source code file (i.e. from an ast)
|
117
|
+
|
118
|
+
path is expected to be a python source file
|
119
|
+
"""
|
120
|
+
try:
|
121
|
+
data = norm_read(path)
|
122
|
+
except IOError, ex:
|
123
|
+
msg = 'Unable to load file %r (%s)' % (path, ex)
|
124
|
+
raise ASTNGBuildingException(msg)
|
125
|
+
self._file = path
|
126
|
+
# get module name if necessary, *before modifying sys.path*
|
127
|
+
if modname is None:
|
128
|
+
try:
|
129
|
+
modname = '.'.join(modpath_from_file(path))
|
130
|
+
except ImportError:
|
131
|
+
modname = splitext(basename(path))[0]
|
132
|
+
# build astng representation
|
133
|
+
try:
|
134
|
+
sys.path.insert(0, dirname(path))
|
135
|
+
node = self.string_build(data, modname, path)
|
136
|
+
node.file = abspath(path)
|
137
|
+
finally:
|
138
|
+
self._file = None
|
139
|
+
sys.path.pop(0)
|
140
|
+
|
141
|
+
return node
|
142
|
+
|
143
|
+
def string_build(self, data, modname='', path=None):
|
144
|
+
"""build astng from a source code stream (i.e. from an ast)"""
|
145
|
+
return self.ast_build(parse(data + '\n'), modname, path)
|
146
|
+
|
147
|
+
def ast_build(self, node, modname='', path=None):
|
148
|
+
"""build the astng from AST, return the new tree"""
|
149
|
+
if path is not None:
|
150
|
+
node_file = abspath(path)
|
151
|
+
else:
|
152
|
+
node_file = '<?>'
|
153
|
+
if modname.endswith('.__init__'):
|
154
|
+
modname = modname[:-9]
|
155
|
+
package = True
|
156
|
+
else:
|
157
|
+
package = path and path.find('__init__.py') > -1 or False
|
158
|
+
newnode = self.rebuilder.build(node, modname, node_file)
|
159
|
+
newnode.package = package
|
160
|
+
return newnode
|
161
|
+
|
162
|
+
# astng from living objects ###############################################
|
163
|
+
#
|
164
|
+
# this is actually a really minimal representation, including only Module,
|
165
|
+
# Function and Class nodes and some others as guessed
|
166
|
+
|
167
|
+
def object_build(self, node, obj):
|
168
|
+
"""recursive method which create a partial ast from real objects
|
169
|
+
(only function, class, and method are handled)
|
170
|
+
"""
|
171
|
+
if self._done.has_key(obj):
|
172
|
+
return self._done[obj]
|
173
|
+
self._done[obj] = node
|
174
|
+
for name in dir(obj):
|
175
|
+
try:
|
176
|
+
member = getattr(obj, name)
|
177
|
+
except AttributeError:
|
178
|
+
# damned ExtensionClass.Base, I know you're there !
|
179
|
+
attach_dummy_node(node, name)
|
180
|
+
continue
|
181
|
+
if ismethod(member):
|
182
|
+
member = member.im_func
|
183
|
+
if isfunction(member):
|
184
|
+
# verify this is not an imported function
|
185
|
+
if member.func_code.co_filename != getattr(self._module, '__file__', None):
|
186
|
+
attach_dummy_node(node, name, member)
|
187
|
+
continue
|
188
|
+
object_build_function(node, member, name)
|
189
|
+
elif isbuiltin(member):
|
190
|
+
# verify this is not an imported member
|
191
|
+
if self._member_module(member) != self._module.__name__:
|
192
|
+
imported_member(node, member, name)
|
193
|
+
continue
|
194
|
+
object_build_methoddescriptor(node, member, name)
|
195
|
+
elif isclass(member):
|
196
|
+
# verify this is not an imported class
|
197
|
+
if self._member_module(member) != self._module.__name__:
|
198
|
+
imported_member(node, member, name)
|
199
|
+
continue
|
200
|
+
if member in self._done:
|
201
|
+
class_node = self._done[member]
|
202
|
+
if not class_node in node.locals.get(name, ()):
|
203
|
+
node.add_local_node(class_node, name)
|
204
|
+
else:
|
205
|
+
class_node = object_build_class(node, member, name)
|
206
|
+
# recursion
|
207
|
+
self.object_build(class_node, member)
|
208
|
+
elif ismethoddescriptor(member):
|
209
|
+
assert isinstance(member, object)
|
210
|
+
object_build_methoddescriptor(node, member, name)
|
211
|
+
elif isdatadescriptor(member):
|
212
|
+
assert isinstance(member, object)
|
213
|
+
object_build_datadescriptor(node, member, name)
|
214
|
+
elif isinstance(member, (int, long, float, str, unicode)) or member is None:
|
215
|
+
attach_const_node(node, name, member)
|
216
|
+
else:
|
217
|
+
# create an empty node so that the name is actually defined
|
218
|
+
attach_dummy_node(node, name, member)
|
219
|
+
|
220
|
+
def _member_module(self, member):
|
221
|
+
modname = getattr(member, '__module__', None)
|
222
|
+
return self._dyn_modname_map.get(modname, modname)
|
223
|
+
|
224
|
+
|
225
|
+
def imported_member(node, member, name):
|
226
|
+
"""consider a class/builtin member where __module__ != current module name
|
227
|
+
|
228
|
+
check if it's sound valid and then add an import node, else use a dummy node
|
229
|
+
"""
|
230
|
+
# /!\ some classes like ExtensionClass doesn't have a
|
231
|
+
# __module__ attribute !
|
232
|
+
member_module = getattr(member, '__module__', '__builtin__')
|
233
|
+
try:
|
234
|
+
getattr(sys.modules[member_module], name)
|
235
|
+
except (KeyError, AttributeError):
|
236
|
+
attach_dummy_node(node, name, member)
|
237
|
+
else:
|
238
|
+
attach_import_node(node, member_module, name)
|
239
|
+
|
@@ -0,0 +1,426 @@
|
|
1
|
+
# This program is free software; you can redistribute it and/or modify it under
|
2
|
+
# the terms of the GNU Lesser General Public License as published by the Free Software
|
3
|
+
# Foundation; either version 2 of the License, or (at your option) any later
|
4
|
+
# version.
|
5
|
+
#
|
6
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
7
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
8
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
9
|
+
#
|
10
|
+
# You should have received a copy of the GNU Lesser General Public License along with
|
11
|
+
# this program; if not, write to the Free Software Foundation, Inc.,
|
12
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
13
|
+
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
|
14
|
+
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
15
|
+
# copyright 2003-2010 Sylvain Thenault, all rights reserved.
|
16
|
+
# contact mailto:thenault@gmail.com
|
17
|
+
#
|
18
|
+
# This file is part of logilab-astng.
|
19
|
+
#
|
20
|
+
# logilab-astng is free software: you can redistribute it and/or modify it
|
21
|
+
# under the terms of the GNU Lesser General Public License as published by the
|
22
|
+
# Free Software Foundation, either version 2.1 of the License, or (at your
|
23
|
+
# option) any later version.
|
24
|
+
#
|
25
|
+
# logilab-astng is distributed in the hope that it will be useful, but
|
26
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
27
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
28
|
+
# for more details.
|
29
|
+
#
|
30
|
+
# You should have received a copy of the GNU Lesser General Public License along
|
31
|
+
# with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
|
32
|
+
"""this module contains a set of functions to handle inference on astng trees
|
33
|
+
|
34
|
+
"""
|
35
|
+
|
36
|
+
from __future__ import generators
|
37
|
+
|
38
|
+
__doctype__ = "restructuredtext en"
|
39
|
+
|
40
|
+
from logilab.common.compat import chain
|
41
|
+
|
42
|
+
try:
|
43
|
+
GeneratorExit # introduced in py2.5
|
44
|
+
except NameError:
|
45
|
+
class GeneratorExit(Exception): pass
|
46
|
+
|
47
|
+
from logilab.astng import MANAGER, nodes, raw_building
|
48
|
+
from logilab.astng import ASTNGError, InferenceError, UnresolvableName, \
|
49
|
+
NoDefault, NotFoundError, ASTNGBuildingException
|
50
|
+
from logilab.astng.bases import YES, Instance, InferenceContext, \
|
51
|
+
_infer_stmts, copy_context, path_wrapper, raise_if_nothing_infered
|
52
|
+
from logilab.astng.protocols import _arguments_infer_argname
|
53
|
+
|
54
|
+
_CONST_PROXY = {
|
55
|
+
type(None): raw_building.build_class('NoneType'),
|
56
|
+
bool: MANAGER.astng_from_class(bool),
|
57
|
+
int: MANAGER.astng_from_class(int),
|
58
|
+
long: MANAGER.astng_from_class(long),
|
59
|
+
float: MANAGER.astng_from_class(float),
|
60
|
+
complex: MANAGER.astng_from_class(complex),
|
61
|
+
str: MANAGER.astng_from_class(str),
|
62
|
+
unicode: MANAGER.astng_from_class(unicode),
|
63
|
+
}
|
64
|
+
_CONST_PROXY[type(None)].parent = _CONST_PROXY[bool].parent
|
65
|
+
|
66
|
+
# TODO : find a nicer way to handle this situation; we should at least
|
67
|
+
# be able to avoid calling MANAGER.astng_from_class(const.value.__class__)
|
68
|
+
# each time (if we can not avoid the property). However __proxied introduced an
|
69
|
+
# infinite recursion (see https://bugs.launchpad.net/pylint/+bug/456870)
|
70
|
+
def _set_proxied(const):
|
71
|
+
return _CONST_PROXY[const.value.__class__]
|
72
|
+
nodes.Const._proxied = property(_set_proxied)
|
73
|
+
|
74
|
+
def Const_pytype(self):
|
75
|
+
return self._proxied.qname()
|
76
|
+
nodes.Const.pytype = Const_pytype
|
77
|
+
|
78
|
+
|
79
|
+
nodes.List._proxied = MANAGER.astng_from_class(list)
|
80
|
+
nodes.Tuple._proxied = MANAGER.astng_from_class(tuple)
|
81
|
+
nodes.Dict._proxied = MANAGER.astng_from_class(dict)
|
82
|
+
|
83
|
+
|
84
|
+
class CallContext:
|
85
|
+
"""when inferring a function call, this class is used to remember values
|
86
|
+
given as argument
|
87
|
+
"""
|
88
|
+
def __init__(self, args, starargs, dstarargs):
|
89
|
+
self.args = []
|
90
|
+
self.nargs = {}
|
91
|
+
for arg in args:
|
92
|
+
if isinstance(arg, nodes.Keyword):
|
93
|
+
self.nargs[arg.arg] = arg.value
|
94
|
+
else:
|
95
|
+
self.args.append(arg)
|
96
|
+
self.starargs = starargs
|
97
|
+
self.dstarargs = dstarargs
|
98
|
+
|
99
|
+
def infer_argument(self, funcnode, name, context):
|
100
|
+
"""infer a function argument value according to the call context"""
|
101
|
+
# 1. search in named keywords
|
102
|
+
try:
|
103
|
+
return self.nargs[name].infer(context)
|
104
|
+
except KeyError:
|
105
|
+
# Function.args.args can be None in astng (means that we don't have
|
106
|
+
# information on argnames)
|
107
|
+
argindex = funcnode.args.find_argname(name)[0]
|
108
|
+
if argindex is not None:
|
109
|
+
# 2. first argument of instance/class method
|
110
|
+
if argindex == 0 and funcnode.type in ('method', 'classmethod'):
|
111
|
+
if context.boundnode is not None:
|
112
|
+
boundnode = context.boundnode
|
113
|
+
else:
|
114
|
+
# XXX can do better ?
|
115
|
+
boundnode = funcnode.parent.frame()
|
116
|
+
if funcnode.type == 'method':
|
117
|
+
if not isinstance(boundnode, Instance):
|
118
|
+
boundnode = Instance(boundnode)
|
119
|
+
return iter((boundnode,))
|
120
|
+
if funcnode.type == 'classmethod':
|
121
|
+
return iter((boundnode,))
|
122
|
+
# 2. search arg index
|
123
|
+
try:
|
124
|
+
return self.args[argindex].infer(context)
|
125
|
+
except IndexError:
|
126
|
+
pass
|
127
|
+
# 3. search in *args (.starargs)
|
128
|
+
if self.starargs is not None:
|
129
|
+
its = []
|
130
|
+
for infered in self.starargs.infer(context):
|
131
|
+
if infered is YES:
|
132
|
+
its.append((YES,))
|
133
|
+
continue
|
134
|
+
try:
|
135
|
+
its.append(infered.getitem(argindex, context).infer(context))
|
136
|
+
except (InferenceError, AttributeError):
|
137
|
+
its.append((YES,))
|
138
|
+
except (IndexError, TypeError):
|
139
|
+
continue
|
140
|
+
if its:
|
141
|
+
return chain(*its)
|
142
|
+
# 4. XXX search in **kwargs (.dstarargs)
|
143
|
+
if self.dstarargs is not None:
|
144
|
+
its = []
|
145
|
+
for infered in self.dstarargs.infer(context):
|
146
|
+
if infered is YES:
|
147
|
+
its.append((YES,))
|
148
|
+
continue
|
149
|
+
try:
|
150
|
+
its.append(infered.getitem(name, context).infer(context))
|
151
|
+
except (InferenceError, AttributeError):
|
152
|
+
its.append((YES,))
|
153
|
+
except (IndexError, TypeError):
|
154
|
+
continue
|
155
|
+
if its:
|
156
|
+
return chain(*its)
|
157
|
+
# 5. */** argument, (Tuple or Dict)
|
158
|
+
if name == funcnode.args.vararg:
|
159
|
+
return iter((nodes.const_factory(())))
|
160
|
+
if name == funcnode.args.kwarg:
|
161
|
+
return iter((nodes.const_factory({})))
|
162
|
+
# 6. return default value if any
|
163
|
+
try:
|
164
|
+
return funcnode.args.default_value(name).infer(context)
|
165
|
+
except NoDefault:
|
166
|
+
raise InferenceError(name)
|
167
|
+
|
168
|
+
|
169
|
+
# .infer method ###############################################################
|
170
|
+
|
171
|
+
|
172
|
+
def infer_end(self, context=None):
|
173
|
+
"""inference's end for node such as Module, Class, Function, Const...
|
174
|
+
"""
|
175
|
+
yield self
|
176
|
+
nodes.Module.infer = infer_end
|
177
|
+
nodes.Class.infer = infer_end
|
178
|
+
nodes.Function.infer = infer_end
|
179
|
+
nodes.Lambda.infer = infer_end
|
180
|
+
nodes.Const.infer = infer_end
|
181
|
+
nodes.List.infer = infer_end
|
182
|
+
nodes.Tuple.infer = infer_end
|
183
|
+
nodes.Dict.infer = infer_end
|
184
|
+
|
185
|
+
|
186
|
+
def infer_name(self, context=None):
|
187
|
+
"""infer a Name: use name lookup rules"""
|
188
|
+
frame, stmts = self.lookup(self.name)
|
189
|
+
if not stmts:
|
190
|
+
raise UnresolvableName(self.name)
|
191
|
+
context = context.clone()
|
192
|
+
context.lookupname = self.name
|
193
|
+
return _infer_stmts(stmts, context, frame)
|
194
|
+
nodes.Name.infer = path_wrapper(infer_name)
|
195
|
+
nodes.AssName.infer_lhs = infer_name # won't work with a path wrapper
|
196
|
+
|
197
|
+
|
198
|
+
def infer_callfunc(self, context=None):
|
199
|
+
"""infer a CallFunc node by trying to guess what the function returns"""
|
200
|
+
callcontext = context.clone()
|
201
|
+
callcontext.callcontext = CallContext(self.args, self.starargs, self.kwargs)
|
202
|
+
callcontext.boundnode = None
|
203
|
+
for callee in self.func.infer(context):
|
204
|
+
if callee is YES:
|
205
|
+
yield callee
|
206
|
+
continue
|
207
|
+
try:
|
208
|
+
if hasattr(callee, 'infer_call_result'):
|
209
|
+
for infered in callee.infer_call_result(self, callcontext):
|
210
|
+
yield infered
|
211
|
+
except InferenceError:
|
212
|
+
## XXX log error ?
|
213
|
+
continue
|
214
|
+
nodes.CallFunc.infer = path_wrapper(raise_if_nothing_infered(infer_callfunc))
|
215
|
+
|
216
|
+
|
217
|
+
def infer_import(self, context=None, asname=True):
|
218
|
+
"""infer an Import node: return the imported module/object"""
|
219
|
+
name = context.lookupname
|
220
|
+
if name is None:
|
221
|
+
raise InferenceError()
|
222
|
+
if asname:
|
223
|
+
yield self.do_import_module(self.real_name(name))
|
224
|
+
else:
|
225
|
+
yield self.do_import_module(name)
|
226
|
+
nodes.Import.infer = path_wrapper(infer_import)
|
227
|
+
|
228
|
+
def infer_name_module(self, name):
|
229
|
+
context = InferenceContext()
|
230
|
+
context.lookupname = name
|
231
|
+
return self.infer(context, asname=False)
|
232
|
+
nodes.Import.infer_name_module = infer_name_module
|
233
|
+
|
234
|
+
|
235
|
+
def infer_from(self, context=None, asname=True):
|
236
|
+
"""infer a From nodes: return the imported module/object"""
|
237
|
+
name = context.lookupname
|
238
|
+
if name is None:
|
239
|
+
raise InferenceError()
|
240
|
+
if asname:
|
241
|
+
name = self.real_name(name)
|
242
|
+
module = self.do_import_module(self.modname)
|
243
|
+
try:
|
244
|
+
context = copy_context(context)
|
245
|
+
context.lookupname = name
|
246
|
+
return _infer_stmts(module.getattr(name), context)
|
247
|
+
except NotFoundError:
|
248
|
+
raise InferenceError(name)
|
249
|
+
nodes.From.infer = path_wrapper(infer_from)
|
250
|
+
|
251
|
+
|
252
|
+
def infer_getattr(self, context=None):
|
253
|
+
"""infer a Getattr node by using getattr on the associated object"""
|
254
|
+
#context = context.clone()
|
255
|
+
for owner in self.expr.infer(context):
|
256
|
+
if owner is YES:
|
257
|
+
yield owner
|
258
|
+
continue
|
259
|
+
try:
|
260
|
+
context.boundnode = owner
|
261
|
+
for obj in owner.igetattr(self.attrname, context):
|
262
|
+
yield obj
|
263
|
+
context.boundnode = None
|
264
|
+
except (NotFoundError, InferenceError):
|
265
|
+
context.boundnode = None
|
266
|
+
except AttributeError:
|
267
|
+
# XXX method / function
|
268
|
+
context.boundnode = None
|
269
|
+
nodes.Getattr.infer = path_wrapper(raise_if_nothing_infered(infer_getattr))
|
270
|
+
nodes.AssAttr.infer_lhs = raise_if_nothing_infered(infer_getattr) # # won't work with a path wrapper
|
271
|
+
|
272
|
+
|
273
|
+
def infer_global(self, context=None):
|
274
|
+
if context.lookupname is None:
|
275
|
+
raise InferenceError()
|
276
|
+
try:
|
277
|
+
return _infer_stmts(self.root().getattr(context.lookupname), context)
|
278
|
+
except NotFoundError:
|
279
|
+
raise InferenceError()
|
280
|
+
nodes.Global.infer = path_wrapper(infer_global)
|
281
|
+
|
282
|
+
|
283
|
+
def infer_subscript(self, context=None):
|
284
|
+
"""infer simple subscription such as [1,2,3][0] or (1,2,3)[-1]"""
|
285
|
+
if isinstance(self.slice, nodes.Index):
|
286
|
+
index = self.slice.value.infer(context).next()
|
287
|
+
if index is YES:
|
288
|
+
yield YES
|
289
|
+
return
|
290
|
+
try:
|
291
|
+
# suppose it's a Tuple/List node (attribute error else)
|
292
|
+
assigned = self.value.getitem(index.value, context)
|
293
|
+
except AttributeError:
|
294
|
+
raise InferenceError()
|
295
|
+
except (IndexError, TypeError):
|
296
|
+
yield YES
|
297
|
+
return
|
298
|
+
for infered in assigned.infer(context):
|
299
|
+
yield infered
|
300
|
+
else:
|
301
|
+
raise InferenceError()
|
302
|
+
nodes.Subscript.infer = path_wrapper(infer_subscript)
|
303
|
+
nodes.Subscript.infer_lhs = raise_if_nothing_infered(infer_subscript)
|
304
|
+
|
305
|
+
|
306
|
+
UNARY_OP_METHOD = {'+': '__pos__',
|
307
|
+
'-': '__neg__',
|
308
|
+
'~': '__invert__',
|
309
|
+
'not': None, # XXX not '__nonzero__'
|
310
|
+
}
|
311
|
+
|
312
|
+
def infer_unaryop(self, context=None):
|
313
|
+
for operand in self.operand.infer(context):
|
314
|
+
try:
|
315
|
+
yield operand.infer_unary_op(self.op)
|
316
|
+
except TypeError:
|
317
|
+
continue
|
318
|
+
except AttributeError:
|
319
|
+
meth = UNARY_OP_METHOD[self.op]
|
320
|
+
if meth is None:
|
321
|
+
yield YES
|
322
|
+
else:
|
323
|
+
try:
|
324
|
+
# XXX just suppose if the type implement meth, returned type
|
325
|
+
# will be the same
|
326
|
+
operand.getattr(meth)
|
327
|
+
yield operand
|
328
|
+
except GeneratorExit:
|
329
|
+
raise
|
330
|
+
except:
|
331
|
+
yield YES
|
332
|
+
nodes.UnaryOp.infer = path_wrapper(infer_unaryop)
|
333
|
+
|
334
|
+
|
335
|
+
BIN_OP_METHOD = {'+': '__add__',
|
336
|
+
'-': '__sub__',
|
337
|
+
'/': '__div__',
|
338
|
+
'//': '__floordiv__',
|
339
|
+
'*': '__mul__',
|
340
|
+
'**': '__power__',
|
341
|
+
'%': '__mod__',
|
342
|
+
'&': '__and__',
|
343
|
+
'|': '__or__',
|
344
|
+
'^': '__xor__',
|
345
|
+
'<<': '__lshift__',
|
346
|
+
'>>': '__rshift__',
|
347
|
+
}
|
348
|
+
|
349
|
+
def _infer_binop(operator, operand1, operand2, context, failures=None):
|
350
|
+
if operand1 is YES:
|
351
|
+
yield operand1
|
352
|
+
return
|
353
|
+
try:
|
354
|
+
for valnode in operand1.infer_binary_op(operator, operand2, context):
|
355
|
+
yield valnode
|
356
|
+
except AttributeError:
|
357
|
+
try:
|
358
|
+
# XXX just suppose if the type implement meth, returned type
|
359
|
+
# will be the same
|
360
|
+
operand1.getattr(BIN_OP_METHOD[operator])
|
361
|
+
yield operand1
|
362
|
+
except:
|
363
|
+
if failures is None:
|
364
|
+
yield YES
|
365
|
+
else:
|
366
|
+
failures.append(operand1)
|
367
|
+
|
368
|
+
def infer_binop(self, context=None):
|
369
|
+
failures = []
|
370
|
+
for lhs in self.left.infer(context):
|
371
|
+
for val in _infer_binop(self.op, lhs, self.right, context, failures):
|
372
|
+
yield val
|
373
|
+
for lhs in failures:
|
374
|
+
for rhs in self.right.infer(context):
|
375
|
+
for val in _infer_binop(self.op, rhs, lhs, context):
|
376
|
+
yield val
|
377
|
+
nodes.BinOp.infer = path_wrapper(infer_binop)
|
378
|
+
|
379
|
+
|
380
|
+
def infer_arguments(self, context=None):
|
381
|
+
name = context.lookupname
|
382
|
+
if name is None:
|
383
|
+
raise InferenceError()
|
384
|
+
return _arguments_infer_argname(self, name, context)
|
385
|
+
nodes.Arguments.infer = infer_arguments
|
386
|
+
|
387
|
+
|
388
|
+
def infer_ass(self, context=None):
|
389
|
+
"""infer a AssName/AssAttr: need to inspect the RHS part of the
|
390
|
+
assign node
|
391
|
+
"""
|
392
|
+
stmt = self.statement()
|
393
|
+
if isinstance(stmt, nodes.AugAssign):
|
394
|
+
return stmt.infer(context)
|
395
|
+
stmts = list(self.assigned_stmts(context=context))
|
396
|
+
return _infer_stmts(stmts, context)
|
397
|
+
nodes.AssName.infer = path_wrapper(infer_ass)
|
398
|
+
nodes.AssAttr.infer = path_wrapper(infer_ass)
|
399
|
+
|
400
|
+
def infer_augassign(self, context=None):
|
401
|
+
failures = []
|
402
|
+
for lhs in self.target.infer_lhs(context):
|
403
|
+
for val in _infer_binop(self.op, lhs, self.value, context, failures):
|
404
|
+
yield val
|
405
|
+
for lhs in failures:
|
406
|
+
for rhs in self.value.infer(context):
|
407
|
+
for val in _infer_binop(self.op, rhs, lhs, context):
|
408
|
+
yield val
|
409
|
+
nodes.AugAssign.infer = path_wrapper(infer_augassign)
|
410
|
+
|
411
|
+
|
412
|
+
# no infer method on DelName and DelAttr (expected InferenceError)
|
413
|
+
|
414
|
+
|
415
|
+
def infer_empty_node(self, context=None):
|
416
|
+
if not self.has_underlying_object():
|
417
|
+
yield YES
|
418
|
+
else:
|
419
|
+
try:
|
420
|
+
for infered in MANAGER.infer_astng_from_something(self.object,
|
421
|
+
context=context):
|
422
|
+
yield infered
|
423
|
+
except ASTNGError:
|
424
|
+
yield YES
|
425
|
+
nodes.EmptyNode.infer = path_wrapper(infer_empty_node)
|
426
|
+
|