bee_python 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +202 -0
- data/build/README +23 -0
- data/egg/egg/build.yml +70 -0
- data/egg/egg/ez_setup.py +280 -0
- data/egg/egg/script.py +12 -0
- data/egg/egg/setup.erb +11 -0
- data/egg/egg/suite.py +37 -0
- data/egg/egg/test.py +31 -0
- data/egg/egg.yml +69 -0
- data/egg/http/build.erb +53 -0
- data/egg/http/server.py +34 -0
- data/egg/http.yml +50 -0
- data/egg/mysql/mysql.py +43 -0
- data/egg/mysql.yml +44 -0
- data/egg/project/build.erb +77 -0
- data/egg/project/script.py +42 -0
- data/egg/project/test.py +31 -0
- data/egg/project.yml +59 -0
- data/egg/script/build.erb +35 -0
- data/egg/script/script.py +42 -0
- data/egg/script.yml +50 -0
- data/egg/soap/build.erb +52 -0
- data/egg/soap/client.py +18 -0
- data/egg/soap/server.py +30 -0
- data/egg/soap.yml +58 -0
- data/egg/source/source.py +42 -0
- data/egg/source.yml +47 -0
- data/egg/test/test.py +28 -0
- data/egg/test.yml +44 -0
- data/egg/xmlrpc/build.erb +52 -0
- data/egg/xmlrpc/client.py +22 -0
- data/egg/xmlrpc/server.py +24 -0
- data/egg/xmlrpc.yml +51 -0
- data/lib/bee_task_python.rb +390 -0
- data/test/build.yml +16 -0
- data/test/tc_bee_task_python.rb +27 -0
- data/test/test_build.rb +26 -0
- data/test/test_build_listener.rb +62 -0
- data/test/ts_bee_python.rb +26 -0
- data/tools/common/__init__.py +5 -0
- data/tools/common/common/__init__.py +140 -0
- data/tools/common/common/__pkginfo__.py +43 -0
- data/tools/common/common/adbh.py +35 -0
- data/tools/common/common/cache.py +114 -0
- data/tools/common/common/changelog.py +234 -0
- data/tools/common/common/clcommands.py +181 -0
- data/tools/common/common/cli.py +212 -0
- data/tools/common/common/compat.py +328 -0
- data/tools/common/common/configuration.py +1087 -0
- data/tools/common/common/contexts.py +58 -0
- data/tools/common/common/corbautils.py +117 -0
- data/tools/common/common/daemon.py +171 -0
- data/tools/common/common/date.py +279 -0
- data/tools/common/common/db.py +49 -0
- data/tools/common/common/dbf.py +229 -0
- data/tools/common/common/debugger.py +208 -0
- data/tools/common/common/decorators.py +190 -0
- data/tools/common/common/deprecation.py +118 -0
- data/tools/common/common/fileutils.py +409 -0
- data/tools/common/common/graph.py +259 -0
- data/tools/common/common/html.py +142 -0
- data/tools/common/common/interface.py +76 -0
- data/tools/common/common/logging_ext.py +166 -0
- data/tools/common/common/modutils.py +670 -0
- data/tools/common/common/optik_ext.py +383 -0
- data/tools/common/common/optparser.py +92 -0
- data/tools/common/common/pdf_ext.py +111 -0
- data/tools/common/common/proc.py +276 -0
- data/tools/common/common/pyro_ext.py +146 -0
- data/tools/common/common/pytest.py +754 -0
- data/tools/common/common/shellutils.py +383 -0
- data/tools/common/common/sphinx_ext.py +87 -0
- data/tools/common/common/sphinxutils.py +122 -0
- data/tools/common/common/sqlgen.py +31 -0
- data/tools/common/common/table.py +930 -0
- data/tools/common/common/tasksqueue.py +97 -0
- data/tools/common/common/test/__init__.py +1 -0
- data/tools/common/common/test/data/ChangeLog +184 -0
- data/tools/common/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
- data/tools/common/common/test/data/__init__.py +1 -0
- data/tools/common/common/test/data/content_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/content_differ_dir/README +1 -0
- data/tools/common/common/test/data/content_differ_dir/subdir/coin +1 -0
- data/tools/common/common/test/data/content_differ_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/file_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/file_differ_dir/README +1 -0
- data/tools/common/common/test/data/file_differ_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
- data/tools/common/common/test/data/find_test/__init__.py +0 -0
- data/tools/common/common/test/data/find_test/foo.txt +0 -0
- data/tools/common/common/test/data/find_test/module.py +0 -0
- data/tools/common/common/test/data/find_test/module2.py +0 -0
- data/tools/common/common/test/data/find_test/newlines.txt +0 -0
- data/tools/common/common/test/data/find_test/noendingnewline.py +0 -0
- data/tools/common/common/test/data/find_test/nonregr.py +0 -0
- data/tools/common/common/test/data/find_test/normal_file.txt +0 -0
- data/tools/common/common/test/data/find_test/spam.txt +0 -0
- data/tools/common/common/test/data/find_test/sub/doc.txt +0 -0
- data/tools/common/common/test/data/find_test/sub/momo.py +0 -0
- data/tools/common/common/test/data/find_test/test.ini +0 -0
- data/tools/common/common/test/data/find_test/test1.msg +0 -0
- data/tools/common/common/test/data/find_test/test2.msg +0 -0
- data/tools/common/common/test/data/find_test/write_protected_file.txt +0 -0
- data/tools/common/common/test/data/foo.txt +9 -0
- data/tools/common/common/test/data/module.py +88 -0
- data/tools/common/common/test/data/module2.py +77 -0
- data/tools/common/common/test/data/newlines.txt +3 -0
- data/tools/common/common/test/data/noendingnewline.py +36 -0
- data/tools/common/common/test/data/nonregr.py +14 -0
- data/tools/common/common/test/data/normal_file.txt +0 -0
- data/tools/common/common/test/data/reference_dir/NOTHING +0 -0
- data/tools/common/common/test/data/reference_dir/README +1 -0
- data/tools/common/common/test/data/reference_dir/subdir/coin +1 -0
- data/tools/common/common/test/data/reference_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/same_dir/NOTHING +0 -0
- data/tools/common/common/test/data/same_dir/README +1 -0
- data/tools/common/common/test/data/same_dir/subdir/coin +1 -0
- data/tools/common/common/test/data/same_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/spam.txt +9 -0
- data/tools/common/common/test/data/sub/doc.txt +1 -0
- data/tools/common/common/test/data/sub/momo.py +1 -0
- data/tools/common/common/test/data/subdir_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/subdir_differ_dir/README +1 -0
- data/tools/common/common/test/data/subdir_differ_dir/subdir/coin +1 -0
- data/tools/common/common/test/data/subdir_differ_dir/subdir/toto.txt +53 -0
- data/tools/common/common/test/data/test.ini +20 -0
- data/tools/common/common/test/data/test1.msg +30 -0
- data/tools/common/common/test/data/test2.msg +42 -0
- data/tools/common/common/test/data/write_protected_file.txt +0 -0
- data/tools/common/common/test/foomod.py +17 -0
- data/tools/common/common/test/unittest_cache.py +129 -0
- data/tools/common/common/test/unittest_changelog.py +37 -0
- data/tools/common/common/test/unittest_compat.py +239 -0
- data/tools/common/common/test/unittest_configuration.py +348 -0
- data/tools/common/common/test/unittest_date.py +154 -0
- data/tools/common/common/test/unittest_decorators.py +62 -0
- data/tools/common/common/test/unittest_deprecation.py +76 -0
- data/tools/common/common/test/unittest_fileutils.py +133 -0
- data/tools/common/common/test/unittest_graph.py +50 -0
- data/tools/common/common/test/unittest_html.py +76 -0
- data/tools/common/common/test/unittest_interface.py +87 -0
- data/tools/common/common/test/unittest_modutils.py +244 -0
- data/tools/common/common/test/unittest_pytest.py +50 -0
- data/tools/common/common/test/unittest_shellutils.py +248 -0
- data/tools/common/common/test/unittest_table.py +448 -0
- data/tools/common/common/test/unittest_taskqueue.py +71 -0
- data/tools/common/common/test/unittest_testlib.py +956 -0
- data/tools/common/common/test/unittest_textutils.py +247 -0
- data/tools/common/common/test/unittest_tree.py +248 -0
- data/tools/common/common/test/unittest_umessage.py +55 -0
- data/tools/common/common/test/unittest_ureports_html.py +64 -0
- data/tools/common/common/test/unittest_ureports_text.py +105 -0
- data/tools/common/common/test/unittest_xmlutils.py +75 -0
- data/tools/common/common/test/utils.py +87 -0
- data/tools/common/common/testlib.py +1927 -0
- data/tools/common/common/textutils.py +476 -0
- data/tools/common/common/tree.py +372 -0
- data/tools/common/common/umessage.py +161 -0
- data/tools/common/common/ureports/__init__.py +174 -0
- data/tools/common/common/ureports/docbook_writer.py +139 -0
- data/tools/common/common/ureports/html_writer.py +131 -0
- data/tools/common/common/ureports/nodes.py +201 -0
- data/tools/common/common/ureports/text_writer.py +140 -0
- data/tools/common/common/vcgutils.py +216 -0
- data/tools/common/common/visitor.py +107 -0
- data/tools/common/common/xmlrpcutils.py +136 -0
- data/tools/common/common/xmlutils.py +61 -0
- data/tools/compile/compile.py +16 -0
- data/tools/coverage/coverage.py +602 -0
- data/tools/epydoc/__init__.py +227 -0
- data/tools/epydoc/__init__.pyc +0 -0
- data/tools/epydoc/apidoc.py +2203 -0
- data/tools/epydoc/apidoc.pyc +0 -0
- data/tools/epydoc/checker.py +349 -0
- data/tools/epydoc/checker.pyc +0 -0
- data/tools/epydoc/cli.py +1470 -0
- data/tools/epydoc/cli.pyc +0 -0
- data/tools/epydoc/compat.py +250 -0
- data/tools/epydoc/compat.pyc +0 -0
- data/tools/epydoc/docbuilder.py +1358 -0
- data/tools/epydoc/docbuilder.pyc +0 -0
- data/tools/epydoc/docintrospecter.py +1056 -0
- data/tools/epydoc/docintrospecter.pyc +0 -0
- data/tools/epydoc/docparser.py +2113 -0
- data/tools/epydoc/docparser.pyc +0 -0
- data/tools/epydoc/docstringparser.py +1111 -0
- data/tools/epydoc/docstringparser.pyc +0 -0
- data/tools/epydoc/docwriter/__init__.py +12 -0
- data/tools/epydoc/docwriter/__init__.pyc +0 -0
- data/tools/epydoc/docwriter/dotgraph.py +1351 -0
- data/tools/epydoc/docwriter/dotgraph.pyc +0 -0
- data/tools/epydoc/docwriter/html.py +3491 -0
- data/tools/epydoc/docwriter/html.pyc +0 -0
- data/tools/epydoc/docwriter/html_colorize.py +909 -0
- data/tools/epydoc/docwriter/html_colorize.pyc +0 -0
- data/tools/epydoc/docwriter/html_css.py +550 -0
- data/tools/epydoc/docwriter/html_css.pyc +0 -0
- data/tools/epydoc/docwriter/html_help.py +190 -0
- data/tools/epydoc/docwriter/html_help.pyc +0 -0
- data/tools/epydoc/docwriter/latex.py +1187 -0
- data/tools/epydoc/docwriter/latex.pyc +0 -0
- data/tools/epydoc/docwriter/plaintext.py +276 -0
- data/tools/epydoc/docwriter/plaintext.pyc +0 -0
- data/tools/epydoc/docwriter/xlink.py +505 -0
- data/tools/epydoc/docwriter/xlink.pyc +0 -0
- data/tools/epydoc/gui.py +1148 -0
- data/tools/epydoc/gui.pyc +0 -0
- data/tools/epydoc/log.py +204 -0
- data/tools/epydoc/log.pyc +0 -0
- data/tools/epydoc/markup/__init__.py +623 -0
- data/tools/epydoc/markup/__init__.pyc +0 -0
- data/tools/epydoc/markup/doctest.py +311 -0
- data/tools/epydoc/markup/doctest.pyc +0 -0
- data/tools/epydoc/markup/epytext.py +2116 -0
- data/tools/epydoc/markup/epytext.pyc +0 -0
- data/tools/epydoc/markup/javadoc.py +250 -0
- data/tools/epydoc/markup/javadoc.pyc +0 -0
- data/tools/epydoc/markup/plaintext.py +78 -0
- data/tools/epydoc/markup/plaintext.pyc +0 -0
- data/tools/epydoc/markup/pyval_repr.py +532 -0
- data/tools/epydoc/markup/pyval_repr.pyc +0 -0
- data/tools/epydoc/markup/restructuredtext.py +906 -0
- data/tools/epydoc/markup/restructuredtext.pyc +0 -0
- data/tools/epydoc/test/__init__.py +97 -0
- data/tools/epydoc/test/__init__.pyc +0 -0
- data/tools/epydoc/test/util.py +226 -0
- data/tools/epydoc/test/util.pyc +0 -0
- data/tools/epydoc/util.py +289 -0
- data/tools/epydoc/util.pyc +0 -0
- data/tools/logilab/logilab/__init__.py +5 -0
- data/tools/logilab/logilab/astng/__init__.py +82 -0
- data/tools/logilab/logilab/astng/__pkginfo__.py +76 -0
- data/tools/logilab/logilab/astng/_exceptions.py +64 -0
- data/tools/logilab/logilab/astng/_nodes_ast.py +667 -0
- data/tools/logilab/logilab/astng/_nodes_compiler.py +758 -0
- data/tools/logilab/logilab/astng/bases.py +608 -0
- data/tools/logilab/logilab/astng/builder.py +239 -0
- data/tools/logilab/logilab/astng/inference.py +426 -0
- data/tools/logilab/logilab/astng/inspector.py +289 -0
- data/tools/logilab/logilab/astng/manager.py +421 -0
- data/tools/logilab/logilab/astng/mixins.py +165 -0
- data/tools/logilab/logilab/astng/node_classes.py +848 -0
- data/tools/logilab/logilab/astng/nodes.py +85 -0
- data/tools/logilab/logilab/astng/nodes_as_string.py +389 -0
- data/tools/logilab/logilab/astng/patchcomptransformer.py +159 -0
- data/tools/logilab/logilab/astng/protocols.py +333 -0
- data/tools/logilab/logilab/astng/raw_building.py +212 -0
- data/tools/logilab/logilab/astng/rebuilder.py +307 -0
- data/tools/logilab/logilab/astng/scoped_nodes.py +951 -0
- data/tools/logilab/logilab/astng/test/__init__.py +19 -0
- data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
- data/tools/logilab/logilab/astng/test/data/MyPyPa-0.1.0-py2.5.zip +0 -0
- data/tools/logilab/logilab/astng/test/data/SSL1/Connection1.py +33 -0
- data/tools/logilab/logilab/astng/test/data/SSL1/__init__.py +20 -0
- data/tools/logilab/logilab/astng/test/data/__init__.py +20 -0
- data/tools/logilab/logilab/astng/test/data/all.py +29 -0
- data/tools/logilab/logilab/astng/test/data/appl/__init__.py +23 -0
- data/tools/logilab/logilab/astng/test/data/appl/myConnection.py +30 -0
- data/tools/logilab/logilab/astng/test/data/format.py +34 -0
- data/tools/logilab/logilab/astng/test/data/module.py +90 -0
- data/tools/logilab/logilab/astng/test/data/module2.py +112 -0
- data/tools/logilab/logilab/astng/test/data/noendingnewline.py +57 -0
- data/tools/logilab/logilab/astng/test/data/nonregr.py +76 -0
- data/tools/logilab/logilab/astng/test/data/notall.py +28 -0
- data/tools/logilab/logilab/astng/test/data2/__init__.py +20 -0
- data/tools/logilab/logilab/astng/test/data2/clientmodule_test.py +51 -0
- data/tools/logilab/logilab/astng/test/data2/suppliermodule_test.py +32 -0
- data/tools/logilab/logilab/astng/test/regrtest.py +135 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/absimport.py +22 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/descriptor_crash.py +31 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/import_package_subpackage_module.py +68 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/package/__init__.py +24 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/__init__.py +20 -0
- data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/module.py +20 -0
- data/tools/logilab/logilab/astng/test/unittest_builder.py +684 -0
- data/tools/logilab/logilab/astng/test/unittest_inference.py +1112 -0
- data/tools/logilab/logilab/astng/test/unittest_inspector.py +105 -0
- data/tools/logilab/logilab/astng/test/unittest_lookup.py +302 -0
- data/tools/logilab/logilab/astng/test/unittest_manager.py +98 -0
- data/tools/logilab/logilab/astng/test/unittest_nodes.py +302 -0
- data/tools/logilab/logilab/astng/test/unittest_scoped_nodes.py +501 -0
- data/tools/logilab/logilab/astng/test/unittest_utils.py +104 -0
- data/tools/logilab/logilab/astng/utils.py +342 -0
- data/tools/logilab/logilab/common/__init__.py +140 -0
- data/tools/logilab/logilab/common/__pkginfo__.py +43 -0
- data/tools/logilab/logilab/common/adbh.py +35 -0
- data/tools/logilab/logilab/common/cache.py +114 -0
- data/tools/logilab/logilab/common/changelog.py +234 -0
- data/tools/logilab/logilab/common/clcommands.py +181 -0
- data/tools/logilab/logilab/common/cli.py +212 -0
- data/tools/logilab/logilab/common/compat.py +328 -0
- data/tools/logilab/logilab/common/configuration.py +1087 -0
- data/tools/logilab/logilab/common/contexts.py +58 -0
- data/tools/logilab/logilab/common/corbautils.py +117 -0
- data/tools/logilab/logilab/common/daemon.py +171 -0
- data/tools/logilab/logilab/common/date.py +279 -0
- data/tools/logilab/logilab/common/db.py +49 -0
- data/tools/logilab/logilab/common/dbf.py +229 -0
- data/tools/logilab/logilab/common/debugger.py +208 -0
- data/tools/logilab/logilab/common/decorators.py +190 -0
- data/tools/logilab/logilab/common/deprecation.py +118 -0
- data/tools/logilab/logilab/common/fileutils.py +409 -0
- data/tools/logilab/logilab/common/graph.py +259 -0
- data/tools/logilab/logilab/common/html.py +142 -0
- data/tools/logilab/logilab/common/interface.py +76 -0
- data/tools/logilab/logilab/common/logging_ext.py +166 -0
- data/tools/logilab/logilab/common/modutils.py +670 -0
- data/tools/logilab/logilab/common/optik_ext.py +383 -0
- data/tools/logilab/logilab/common/optparser.py +92 -0
- data/tools/logilab/logilab/common/pdf_ext.py +111 -0
- data/tools/logilab/logilab/common/proc.py +276 -0
- data/tools/logilab/logilab/common/pyro_ext.py +146 -0
- data/tools/logilab/logilab/common/pytest.py +754 -0
- data/tools/logilab/logilab/common/shellutils.py +383 -0
- data/tools/logilab/logilab/common/sphinx_ext.py +87 -0
- data/tools/logilab/logilab/common/sphinxutils.py +122 -0
- data/tools/logilab/logilab/common/sqlgen.py +31 -0
- data/tools/logilab/logilab/common/table.py +930 -0
- data/tools/logilab/logilab/common/tasksqueue.py +97 -0
- data/tools/logilab/logilab/common/test/__init__.py +1 -0
- data/tools/logilab/logilab/common/test/data/ChangeLog +184 -0
- data/tools/logilab/logilab/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
- data/tools/logilab/logilab/common/test/data/__init__.py +1 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/coin +1 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/subdirtwo/Hello +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/__init__.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/foo.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/module.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/module2.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/newlines.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/noendingnewline.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/nonregr.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/normal_file.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/spam.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/sub/doc.txt +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/sub/momo.py +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/test.ini +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/test1.msg +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/test2.msg +0 -0
- data/tools/logilab/logilab/common/test/data/find_test/write_protected_file.txt +0 -0
- data/tools/logilab/logilab/common/test/data/foo.txt +9 -0
- data/tools/logilab/logilab/common/test/data/module.py +88 -0
- data/tools/logilab/logilab/common/test/data/module2.py +77 -0
- data/tools/logilab/logilab/common/test/data/newlines.txt +3 -0
- data/tools/logilab/logilab/common/test/data/noendingnewline.py +36 -0
- data/tools/logilab/logilab/common/test/data/nonregr.py +14 -0
- data/tools/logilab/logilab/common/test/data/normal_file.txt +0 -0
- data/tools/logilab/logilab/common/test/data/reference_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/reference_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/reference_dir/subdir/coin +1 -0
- data/tools/logilab/logilab/common/test/data/reference_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/same_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/same_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/same_dir/subdir/coin +1 -0
- data/tools/logilab/logilab/common/test/data/same_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/spam.txt +9 -0
- data/tools/logilab/logilab/common/test/data/sub/doc.txt +1 -0
- data/tools/logilab/logilab/common/test/data/sub/momo.py +1 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/README +1 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/coin +1 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/toto.txt +53 -0
- data/tools/logilab/logilab/common/test/data/test.ini +20 -0
- data/tools/logilab/logilab/common/test/data/test1.msg +30 -0
- data/tools/logilab/logilab/common/test/data/test2.msg +42 -0
- data/tools/logilab/logilab/common/test/data/write_protected_file.txt +0 -0
- data/tools/logilab/logilab/common/test/foomod.py +17 -0
- data/tools/logilab/logilab/common/test/unittest_cache.py +129 -0
- data/tools/logilab/logilab/common/test/unittest_changelog.py +37 -0
- data/tools/logilab/logilab/common/test/unittest_compat.py +239 -0
- data/tools/logilab/logilab/common/test/unittest_configuration.py +348 -0
- data/tools/logilab/logilab/common/test/unittest_date.py +154 -0
- data/tools/logilab/logilab/common/test/unittest_decorators.py +62 -0
- data/tools/logilab/logilab/common/test/unittest_deprecation.py +76 -0
- data/tools/logilab/logilab/common/test/unittest_fileutils.py +133 -0
- data/tools/logilab/logilab/common/test/unittest_graph.py +50 -0
- data/tools/logilab/logilab/common/test/unittest_html.py +76 -0
- data/tools/logilab/logilab/common/test/unittest_interface.py +87 -0
- data/tools/logilab/logilab/common/test/unittest_modutils.py +244 -0
- data/tools/logilab/logilab/common/test/unittest_pytest.py +50 -0
- data/tools/logilab/logilab/common/test/unittest_shellutils.py +248 -0
- data/tools/logilab/logilab/common/test/unittest_table.py +448 -0
- data/tools/logilab/logilab/common/test/unittest_taskqueue.py +71 -0
- data/tools/logilab/logilab/common/test/unittest_testlib.py +956 -0
- data/tools/logilab/logilab/common/test/unittest_textutils.py +247 -0
- data/tools/logilab/logilab/common/test/unittest_tree.py +248 -0
- data/tools/logilab/logilab/common/test/unittest_umessage.py +55 -0
- data/tools/logilab/logilab/common/test/unittest_ureports_html.py +64 -0
- data/tools/logilab/logilab/common/test/unittest_ureports_text.py +105 -0
- data/tools/logilab/logilab/common/test/unittest_xmlutils.py +75 -0
- data/tools/logilab/logilab/common/test/utils.py +87 -0
- data/tools/logilab/logilab/common/testlib.py +1927 -0
- data/tools/logilab/logilab/common/textutils.py +476 -0
- data/tools/logilab/logilab/common/tree.py +372 -0
- data/tools/logilab/logilab/common/umessage.py +161 -0
- data/tools/logilab/logilab/common/ureports/__init__.py +174 -0
- data/tools/logilab/logilab/common/ureports/docbook_writer.py +139 -0
- data/tools/logilab/logilab/common/ureports/html_writer.py +131 -0
- data/tools/logilab/logilab/common/ureports/nodes.py +201 -0
- data/tools/logilab/logilab/common/ureports/text_writer.py +140 -0
- data/tools/logilab/logilab/common/vcgutils.py +216 -0
- data/tools/logilab/logilab/common/visitor.py +107 -0
- data/tools/logilab/logilab/common/xmlrpcutils.py +136 -0
- data/tools/logilab/logilab/common/xmlutils.py +61 -0
- data/tools/pychecker/COPYRIGHT +31 -0
- data/tools/pychecker/ChangeLog +349 -0
- data/tools/pychecker/CodeChecks.py +1969 -0
- data/tools/pychecker/CodeChecks.pyc +0 -0
- data/tools/pychecker/CodeChecks.pyo +0 -0
- data/tools/pychecker/Config.py +475 -0
- data/tools/pychecker/Config.pyc +0 -0
- data/tools/pychecker/Config.pyo +0 -0
- data/tools/pychecker/KNOWN_BUGS +100 -0
- data/tools/pychecker/MAINTAINERS +81 -0
- data/tools/pychecker/NEWS +406 -0
- data/tools/pychecker/OP.py +131 -0
- data/tools/pychecker/OP.pyc +0 -0
- data/tools/pychecker/OP.pyo +0 -0
- data/tools/pychecker/OptionTypes.py +117 -0
- data/tools/pychecker/OptionTypes.pyc +0 -0
- data/tools/pychecker/OptionTypes.pyo +0 -0
- data/tools/pychecker/README +152 -0
- data/tools/pychecker/Stack.py +115 -0
- data/tools/pychecker/Stack.pyc +0 -0
- data/tools/pychecker/Stack.pyo +0 -0
- data/tools/pychecker/TODO +101 -0
- data/tools/pychecker/VERSION +1 -0
- data/tools/pychecker/Warning.py +50 -0
- data/tools/pychecker/Warning.pyc +0 -0
- data/tools/pychecker/Warning.pyo +0 -0
- data/tools/pychecker/__init__.py +17 -0
- data/tools/pychecker/__init__.pyc +0 -0
- data/tools/pychecker/__init__.pyo +0 -0
- data/tools/pychecker/checker.py +961 -0
- data/tools/pychecker/checker.pyc +0 -0
- data/tools/pychecker/checker.pyo +0 -0
- data/tools/pychecker/function.py +159 -0
- data/tools/pychecker/function.pyc +0 -0
- data/tools/pychecker/function.pyo +0 -0
- data/tools/pychecker/msgs.py +175 -0
- data/tools/pychecker/msgs.pyc +0 -0
- data/tools/pychecker/msgs.pyo +0 -0
- data/tools/pychecker/options.py +275 -0
- data/tools/pychecker/options.pyc +0 -0
- data/tools/pychecker/options.pyo +0 -0
- data/tools/pychecker/pcmodules.py +19 -0
- data/tools/pychecker/pcmodules.pyc +0 -0
- data/tools/pychecker/pcmodules.pyo +0 -0
- data/tools/pychecker/printer.py +47 -0
- data/tools/pychecker/printer.pyc +0 -0
- data/tools/pychecker/printer.pyo +0 -0
- data/tools/pychecker/python.py +427 -0
- data/tools/pychecker/python.pyc +0 -0
- data/tools/pychecker/python.pyo +0 -0
- data/tools/pychecker/utils.py +102 -0
- data/tools/pychecker/utils.pyc +0 -0
- data/tools/pychecker/utils.pyo +0 -0
- data/tools/pychecker/warn.py +778 -0
- data/tools/pychecker/warn.pyc +0 -0
- data/tools/pychecker/warn.pyo +0 -0
- data/tools/pylint2/pylint/__init__.py +16 -0
- data/tools/pylint2/pylint/__pkginfo__.py +67 -0
- data/tools/pylint2/pylint/checkers/__init__.py +155 -0
- data/tools/pylint2/pylint/checkers/base.py +749 -0
- data/tools/pylint2/pylint/checkers/classes.py +527 -0
- data/tools/pylint2/pylint/checkers/design_analysis.py +344 -0
- data/tools/pylint2/pylint/checkers/exceptions.py +183 -0
- data/tools/pylint2/pylint/checkers/format.py +367 -0
- data/tools/pylint2/pylint/checkers/imports.py +379 -0
- data/tools/pylint2/pylint/checkers/logging.py +98 -0
- data/tools/pylint2/pylint/checkers/misc.py +128 -0
- data/tools/pylint2/pylint/checkers/newstyle.py +107 -0
- data/tools/pylint2/pylint/checkers/raw_metrics.py +125 -0
- data/tools/pylint2/pylint/checkers/similar.py +333 -0
- data/tools/pylint2/pylint/checkers/string_format.py +239 -0
- data/tools/pylint2/pylint/checkers/typecheck.py +364 -0
- data/tools/pylint2/pylint/checkers/utils.py +208 -0
- data/tools/pylint2/pylint/checkers/variables.py +498 -0
- data/tools/pylint2/pylint/config.py +149 -0
- data/tools/pylint2/pylint/epylint.py +149 -0
- data/tools/pylint2/pylint/gui.py +433 -0
- data/tools/pylint2/pylint/interfaces.py +98 -0
- data/tools/pylint2/pylint/lint.py +914 -0
- data/tools/pylint2/pylint/pyreverse/__init__.py +5 -0
- data/tools/pylint2/pylint/pyreverse/diadefslib.py +229 -0
- data/tools/pylint2/pylint/pyreverse/diagrams.py +247 -0
- data/tools/pylint2/pylint/pyreverse/main.py +123 -0
- data/tools/pylint2/pylint/pyreverse/utils.py +131 -0
- data/tools/pylint2/pylint/pyreverse/writer.py +196 -0
- data/tools/pylint2/pylint/reporters/__init__.py +67 -0
- data/tools/pylint2/pylint/reporters/guireporter.py +36 -0
- data/tools/pylint2/pylint/reporters/html.py +69 -0
- data/tools/pylint2/pylint/reporters/text.py +156 -0
- data/tools/pylint2/pylint/utils.py +518 -0
- data/tools/pylint2/pylint.py +16 -0
- data/tools/test/suite.py +35 -0
- metadata +566 -0
@@ -0,0 +1,229 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
|
3
|
+
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
4
|
+
#
|
5
|
+
# This file is part of logilab-common.
|
6
|
+
#
|
7
|
+
# logilab-common is free software: you can redistribute it and/or modify it under
|
8
|
+
# the terms of the GNU Lesser General Public License as published by the Free
|
9
|
+
# Software Foundation, either version 2.1 of the License, or (at your option) any
|
10
|
+
# later version.
|
11
|
+
#
|
12
|
+
# logilab-common is distributed in the hope that it will be useful, but WITHOUT
|
13
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
14
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
15
|
+
# details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Lesser General Public License along
|
18
|
+
# with logilab-common. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
"""This is a DBF reader which reads Visual Fox Pro DBF format with Memo field
|
20
|
+
|
21
|
+
Usage:
|
22
|
+
|
23
|
+
>>> rec = readDbf('test.dbf')
|
24
|
+
>>> for line in rec:
|
25
|
+
>>> print line['name']
|
26
|
+
|
27
|
+
|
28
|
+
:date: 13/07/2007
|
29
|
+
|
30
|
+
http://www.physics.ox.ac.uk/users/santoso/Software.Repository.html
|
31
|
+
page says code is "available as is without any warranty or support".
|
32
|
+
"""
|
33
|
+
|
34
|
+
import struct
|
35
|
+
import os, os.path
|
36
|
+
import sys
|
37
|
+
import csv
|
38
|
+
import tempfile
|
39
|
+
import ConfigParser
|
40
|
+
|
41
|
+
class Dbase:
|
42
|
+
def __init__(self):
|
43
|
+
self.fdb = None
|
44
|
+
self.fmemo = None
|
45
|
+
self.db_data = None
|
46
|
+
self.memo_data = None
|
47
|
+
self.fields = None
|
48
|
+
self.num_records = 0
|
49
|
+
self.header = None
|
50
|
+
self.memo_file = ''
|
51
|
+
self.memo_header = None
|
52
|
+
self.memo_block_size = 0
|
53
|
+
self.memo_header_len = 0
|
54
|
+
|
55
|
+
def _drop_after_NULL(self, txt):
|
56
|
+
for i in range(0, len(txt)):
|
57
|
+
if ord(struct.unpack('c', txt[i])[0])==0:
|
58
|
+
return txt[:i]
|
59
|
+
return txt
|
60
|
+
|
61
|
+
def _reverse_endian(self, num):
|
62
|
+
if not len(num):
|
63
|
+
return 0
|
64
|
+
val = struct.unpack('<L', num)
|
65
|
+
val = struct.pack('>L', val[0])
|
66
|
+
val = struct.unpack('>L', val)
|
67
|
+
return val[0]
|
68
|
+
|
69
|
+
def _assign_ids(self, lst, ids):
|
70
|
+
result = {}
|
71
|
+
idx = 0
|
72
|
+
for item in lst:
|
73
|
+
id = ids[idx]
|
74
|
+
result[id] = item
|
75
|
+
idx += 1
|
76
|
+
return result
|
77
|
+
|
78
|
+
def open(self, db_name):
|
79
|
+
filesize = os.path.getsize(db_name)
|
80
|
+
if filesize <= 68:
|
81
|
+
raise IOError, 'The file is not large enough to be a dbf file'
|
82
|
+
|
83
|
+
self.fdb = open(db_name, 'rb')
|
84
|
+
|
85
|
+
self.memo_file = ''
|
86
|
+
if os.path.isfile(db_name[0:-1] + 't'):
|
87
|
+
self.memo_file = db_name[0:-1] + 't'
|
88
|
+
elif os.path.isfile(db_name[0:-3] + 'fpt'):
|
89
|
+
self.memo_file = db_name[0:-3] + 'fpt'
|
90
|
+
|
91
|
+
if self.memo_file:
|
92
|
+
#Read memo file
|
93
|
+
self.fmemo = open(self.memo_file, 'rb')
|
94
|
+
self.memo_data = self.fmemo.read()
|
95
|
+
self.memo_header = self._assign_ids(struct.unpack('>6x1H', self.memo_data[:8]), ['Block size'])
|
96
|
+
block_size = self.memo_header['Block size']
|
97
|
+
if not block_size:
|
98
|
+
block_size = 512
|
99
|
+
self.memo_block_size = block_size
|
100
|
+
self.memo_header_len = block_size
|
101
|
+
memo_size = os.path.getsize(self.memo_file)
|
102
|
+
|
103
|
+
#Start reading data file
|
104
|
+
data = self.fdb.read(32)
|
105
|
+
self.header = self._assign_ids(struct.unpack('<B 3B L 2H 20x', data), ['id', 'Year', 'Month', 'Day', '# of Records', 'Header Size', 'Record Size'])
|
106
|
+
self.header['id'] = hex(self.header['id'])
|
107
|
+
|
108
|
+
self.num_records = self.header['# of Records']
|
109
|
+
data = self.fdb.read(self.header['Header Size']-34)
|
110
|
+
self.fields = {}
|
111
|
+
x = 0
|
112
|
+
header_pattern = '<11s c 4x B B 14x'
|
113
|
+
ids = ['Field Name', 'Field Type', 'Field Length', 'Field Precision']
|
114
|
+
pattern_len = 32
|
115
|
+
for offset in range(0, len(data), 32):
|
116
|
+
if ord(data[offset])==0x0d:
|
117
|
+
break
|
118
|
+
x += 1
|
119
|
+
data_subset = data[offset: offset+pattern_len]
|
120
|
+
if len(data_subset) < pattern_len:
|
121
|
+
data_subset += ' '*(pattern_len-len(data_subset))
|
122
|
+
self.fields[x] = self._assign_ids(struct.unpack(header_pattern, data_subset), ids)
|
123
|
+
self.fields[x]['Field Name'] = self._drop_after_NULL(self.fields[x]['Field Name'])
|
124
|
+
|
125
|
+
self.fdb.read(3)
|
126
|
+
if self.header['# of Records']:
|
127
|
+
data_size = (self.header['# of Records'] * self.header['Record Size']) - 1
|
128
|
+
self.db_data = self.fdb.read(data_size)
|
129
|
+
else:
|
130
|
+
self.db_data = ''
|
131
|
+
self.row_format = '<'
|
132
|
+
self.row_ids = []
|
133
|
+
self.row_len = 0
|
134
|
+
for key in self.fields:
|
135
|
+
field = self.fields[key]
|
136
|
+
self.row_format += '%ds ' % (field['Field Length'])
|
137
|
+
self.row_ids.append(field['Field Name'])
|
138
|
+
self.row_len += field['Field Length']
|
139
|
+
|
140
|
+
def close(self):
|
141
|
+
if self.fdb:
|
142
|
+
self.fdb.close()
|
143
|
+
if self.fmemo:
|
144
|
+
self.fmemo.close()
|
145
|
+
|
146
|
+
def get_numrecords(self):
|
147
|
+
return self.num_records
|
148
|
+
|
149
|
+
def get_record_with_names(self, rec_no):
|
150
|
+
"""
|
151
|
+
This function accept record number from 0 to N-1
|
152
|
+
"""
|
153
|
+
if rec_no < 0 or rec_no > self.num_records:
|
154
|
+
raise Exception, 'Unable to extract data outside the range'
|
155
|
+
|
156
|
+
offset = self.header['Record Size'] * rec_no
|
157
|
+
data = self.db_data[offset:offset+self.row_len]
|
158
|
+
record = self._assign_ids(struct.unpack(self.row_format, data), self.row_ids)
|
159
|
+
|
160
|
+
if self.memo_file:
|
161
|
+
for key in self.fields:
|
162
|
+
field = self.fields[key]
|
163
|
+
f_type = field['Field Type']
|
164
|
+
f_name = field['Field Name']
|
165
|
+
c_data = record[f_name]
|
166
|
+
|
167
|
+
if f_type=='M' or f_type=='G' or f_type=='B' or f_type=='P':
|
168
|
+
c_data = self._reverse_endian(c_data)
|
169
|
+
if c_data:
|
170
|
+
record[f_name] = self.read_memo(c_data-1).strip()
|
171
|
+
else:
|
172
|
+
record[f_name] = c_data.strip()
|
173
|
+
return record
|
174
|
+
|
175
|
+
def read_memo_record(self, num, in_length):
|
176
|
+
"""
|
177
|
+
Read the record of given number. The second parameter is the length of
|
178
|
+
the record to read. It can be undefined, meaning read the whole record,
|
179
|
+
and it can be negative, meaning at most the length
|
180
|
+
"""
|
181
|
+
if in_length < 0:
|
182
|
+
in_length = -self.memo_block_size
|
183
|
+
|
184
|
+
offset = self.memo_header_len + num * self.memo_block_size
|
185
|
+
self.fmemo.seek(offset)
|
186
|
+
if in_length<0:
|
187
|
+
in_length = -in_length
|
188
|
+
if in_length==0:
|
189
|
+
return ''
|
190
|
+
return self.fmemo.read(in_length)
|
191
|
+
|
192
|
+
def read_memo(self, num):
|
193
|
+
result = ''
|
194
|
+
buffer = self.read_memo_record(num, -1)
|
195
|
+
if len(buffer)<=0:
|
196
|
+
return ''
|
197
|
+
length = struct.unpack('>L', buffer[4:4+4])[0] + 8
|
198
|
+
|
199
|
+
block_size = self.memo_block_size
|
200
|
+
if length < block_size:
|
201
|
+
return buffer[8:length]
|
202
|
+
rest_length = length - block_size
|
203
|
+
rest_data = self.read_memo_record(num+1, rest_length)
|
204
|
+
if len(rest_data)<=0:
|
205
|
+
return ''
|
206
|
+
return buffer[8:] + rest_data
|
207
|
+
|
208
|
+
def readDbf(filename):
|
209
|
+
"""
|
210
|
+
Read the DBF file specified by the filename and
|
211
|
+
return the records as a list of dictionary.
|
212
|
+
|
213
|
+
:param: filename File name of the DBF
|
214
|
+
:return: List of rows
|
215
|
+
"""
|
216
|
+
db = Dbase()
|
217
|
+
db.open(filename)
|
218
|
+
num = db.get_numrecords()
|
219
|
+
rec = []
|
220
|
+
for i in range(0, num):
|
221
|
+
record = db.get_record_with_names(i)
|
222
|
+
rec.append(record)
|
223
|
+
db.close()
|
224
|
+
return rec
|
225
|
+
|
226
|
+
if __name__=='__main__':
|
227
|
+
rec = readDbf('dbf/sptable.dbf')
|
228
|
+
for line in rec:
|
229
|
+
print '%s %s' % (line['GENUS'].strip(), line['SPECIES'].strip())
|
@@ -0,0 +1,208 @@
|
|
1
|
+
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
|
2
|
+
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
3
|
+
#
|
4
|
+
# This file is part of logilab-common.
|
5
|
+
#
|
6
|
+
# logilab-common is free software: you can redistribute it and/or modify it under
|
7
|
+
# the terms of the GNU Lesser General Public License as published by the Free
|
8
|
+
# Software Foundation, either version 2.1 of the License, or (at your option) any
|
9
|
+
# later version.
|
10
|
+
#
|
11
|
+
# logilab-common is distributed in the hope that it will be useful, but WITHOUT
|
12
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
13
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
14
|
+
# details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License along
|
17
|
+
# with logilab-common. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
"""Customized version of pdb's default debugger.
|
19
|
+
|
20
|
+
- sets up a history file
|
21
|
+
- uses ipython if available to colorize lines of code
|
22
|
+
- overrides list command to search for current block instead
|
23
|
+
of using 5 lines of context
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
"""
|
29
|
+
__docformat__ = "restructuredtext en"
|
30
|
+
|
31
|
+
try:
|
32
|
+
import readline
|
33
|
+
except ImportError:
|
34
|
+
readline = None
|
35
|
+
import os
|
36
|
+
import os.path as osp
|
37
|
+
import sys
|
38
|
+
from pdb import Pdb
|
39
|
+
from cStringIO import StringIO
|
40
|
+
import inspect
|
41
|
+
|
42
|
+
try:
|
43
|
+
from IPython import PyColorize
|
44
|
+
except ImportError:
|
45
|
+
def colorize(source, *args):
|
46
|
+
"""fallback colorize function"""
|
47
|
+
return source
|
48
|
+
def colorize_source(source, *args):
|
49
|
+
return source
|
50
|
+
else:
|
51
|
+
def colorize(source, start_lineno, curlineno):
|
52
|
+
"""colorize and annotate source with linenos
|
53
|
+
(as in pdb's list command)
|
54
|
+
"""
|
55
|
+
parser = PyColorize.Parser()
|
56
|
+
output = StringIO()
|
57
|
+
parser.format(source, output)
|
58
|
+
annotated = []
|
59
|
+
for index, line in enumerate(output.getvalue().splitlines()):
|
60
|
+
lineno = index + start_lineno
|
61
|
+
if lineno == curlineno:
|
62
|
+
annotated.append('%4s\t->\t%s' % (lineno, line))
|
63
|
+
else:
|
64
|
+
annotated.append('%4s\t\t%s' % (lineno, line))
|
65
|
+
return '\n'.join(annotated)
|
66
|
+
|
67
|
+
def colorize_source(source):
|
68
|
+
"""colorize given source"""
|
69
|
+
parser = PyColorize.Parser()
|
70
|
+
output = StringIO()
|
71
|
+
parser.format(source, output)
|
72
|
+
return output.getvalue()
|
73
|
+
|
74
|
+
|
75
|
+
def getsource(obj):
|
76
|
+
"""Return the text of the source code for an object.
|
77
|
+
|
78
|
+
The argument may be a module, class, method, function, traceback, frame,
|
79
|
+
or code object. The source code is returned as a single string. An
|
80
|
+
IOError is raised if the source code cannot be retrieved."""
|
81
|
+
lines, lnum = inspect.getsourcelines(obj)
|
82
|
+
return ''.join(lines), lnum
|
83
|
+
|
84
|
+
|
85
|
+
################################################################
|
86
|
+
class Debugger(Pdb):
|
87
|
+
"""custom debugger
|
88
|
+
|
89
|
+
- sets up a history file
|
90
|
+
- uses ipython if available to colorize lines of code
|
91
|
+
- overrides list command to search for current block instead
|
92
|
+
of using 5 lines of context
|
93
|
+
"""
|
94
|
+
def __init__(self, tcbk=None):
|
95
|
+
Pdb.__init__(self)
|
96
|
+
self.reset()
|
97
|
+
if tcbk:
|
98
|
+
while tcbk.tb_next is not None:
|
99
|
+
tcbk = tcbk.tb_next
|
100
|
+
self._tcbk = tcbk
|
101
|
+
self._histfile = osp.join(os.environ["HOME"], ".pdbhist")
|
102
|
+
|
103
|
+
def setup_history_file(self):
|
104
|
+
"""if readline is available, read pdb history file
|
105
|
+
"""
|
106
|
+
if readline is not None:
|
107
|
+
try:
|
108
|
+
readline.read_history_file(self._histfile)
|
109
|
+
except IOError:
|
110
|
+
pass
|
111
|
+
|
112
|
+
def start(self):
|
113
|
+
"""starts the interactive mode"""
|
114
|
+
self.interaction(self._tcbk.tb_frame, self._tcbk)
|
115
|
+
|
116
|
+
def setup(self, frame, tcbk):
|
117
|
+
"""setup hook: set up history file"""
|
118
|
+
self.setup_history_file()
|
119
|
+
Pdb.setup(self, frame, tcbk)
|
120
|
+
|
121
|
+
def set_quit(self):
|
122
|
+
"""quit hook: save commands in the history file"""
|
123
|
+
if readline is not None:
|
124
|
+
readline.write_history_file(self._histfile)
|
125
|
+
Pdb.set_quit(self)
|
126
|
+
|
127
|
+
def complete_p(self, text, line, begin_idx, end_idx):
|
128
|
+
"""provide variable names completion for the ``p`` command"""
|
129
|
+
namespace = dict(self.curframe.f_globals)
|
130
|
+
namespace.update(self.curframe.f_locals)
|
131
|
+
if '.' in text:
|
132
|
+
return self.attr_matches(text, namespace)
|
133
|
+
return [varname for varname in namespace if varname.startswith(text)]
|
134
|
+
|
135
|
+
|
136
|
+
def attr_matches(self, text, namespace):
|
137
|
+
"""implementation coming from rlcompleter.Completer.attr_matches
|
138
|
+
Compute matches when text contains a dot.
|
139
|
+
|
140
|
+
Assuming the text is of the form NAME.NAME....[NAME], and is
|
141
|
+
evaluatable in self.namespace, it will be evaluated and its attributes
|
142
|
+
(as revealed by dir()) are used as possible completions. (For class
|
143
|
+
instances, class members are also considered.)
|
144
|
+
|
145
|
+
WARNING: this can still invoke arbitrary C code, if an object
|
146
|
+
with a __getattr__ hook is evaluated.
|
147
|
+
|
148
|
+
"""
|
149
|
+
import re
|
150
|
+
m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
|
151
|
+
if not m:
|
152
|
+
return
|
153
|
+
expr, attr = m.group(1, 3)
|
154
|
+
object = eval(expr, namespace)
|
155
|
+
words = dir(object)
|
156
|
+
if hasattr(object,'__class__'):
|
157
|
+
words.append('__class__')
|
158
|
+
words = words + self.get_class_members(object.__class__)
|
159
|
+
matches = []
|
160
|
+
n = len(attr)
|
161
|
+
for word in words:
|
162
|
+
if word[:n] == attr and word != "__builtins__":
|
163
|
+
matches.append("%s.%s" % (expr, word))
|
164
|
+
return matches
|
165
|
+
|
166
|
+
def get_class_members(self, klass):
|
167
|
+
"""implementation coming from rlcompleter.get_class_members"""
|
168
|
+
ret = dir(klass)
|
169
|
+
if hasattr(klass,'__bases__'):
|
170
|
+
for base in klass.__bases__:
|
171
|
+
ret = ret + self.get_class_members(base)
|
172
|
+
return ret
|
173
|
+
|
174
|
+
## specific / overridden commands
|
175
|
+
def do_list(self, arg):
|
176
|
+
"""overrides default list command to display the surrounding block
|
177
|
+
instead of 5 lines of context
|
178
|
+
"""
|
179
|
+
self.lastcmd = 'list'
|
180
|
+
if not arg:
|
181
|
+
try:
|
182
|
+
source, start_lineno = getsource(self.curframe)
|
183
|
+
print colorize(''.join(source), start_lineno,
|
184
|
+
self.curframe.f_lineno)
|
185
|
+
except KeyboardInterrupt:
|
186
|
+
pass
|
187
|
+
except IOError:
|
188
|
+
Pdb.do_list(self, arg)
|
189
|
+
else:
|
190
|
+
Pdb.do_list(self, arg)
|
191
|
+
do_l = do_list
|
192
|
+
|
193
|
+
def do_open(self, arg):
|
194
|
+
"""opens source file corresponding to the current stack level"""
|
195
|
+
filename = self.curframe.f_code.co_filename
|
196
|
+
lineno = self.curframe.f_lineno
|
197
|
+
cmd = 'emacsclient --no-wait +%s %s' % (lineno, filename)
|
198
|
+
os.system(cmd)
|
199
|
+
|
200
|
+
do_o = do_open
|
201
|
+
|
202
|
+
def pm():
|
203
|
+
"""use our custom debugger"""
|
204
|
+
dbg = Debugger(sys.last_traceback)
|
205
|
+
dbg.start()
|
206
|
+
|
207
|
+
def set_trace():
|
208
|
+
Debugger().set_trace(sys._getframe().f_back)
|
@@ -0,0 +1,190 @@
|
|
1
|
+
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
|
2
|
+
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
3
|
+
#
|
4
|
+
# This file is part of logilab-common.
|
5
|
+
#
|
6
|
+
# logilab-common is free software: you can redistribute it and/or modify it under
|
7
|
+
# the terms of the GNU Lesser General Public License as published by the Free
|
8
|
+
# Software Foundation, either version 2.1 of the License, or (at your option) any
|
9
|
+
# later version.
|
10
|
+
#
|
11
|
+
# logilab-common is distributed in the hope that it will be useful, but WITHOUT
|
12
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
13
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
14
|
+
# details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License along
|
17
|
+
# with logilab-common. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
"""A few useful function/method decorators.
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
"""
|
24
|
+
__docformat__ = "restructuredtext en"
|
25
|
+
|
26
|
+
from types import MethodType
|
27
|
+
from time import clock, time
|
28
|
+
import sys, re
|
29
|
+
|
30
|
+
# XXX rewrite so we can use the decorator syntax when keyarg has to be specified
|
31
|
+
|
32
|
+
def cached(callableobj, keyarg=None):
|
33
|
+
"""Simple decorator to cache result of method call."""
|
34
|
+
if callableobj.func_code.co_argcount == 1 or keyarg == 0:
|
35
|
+
|
36
|
+
def cache_wrapper1(self, *args):
|
37
|
+
cache = '_%s_cache_' % callableobj.__name__
|
38
|
+
#print 'cache1?', cache
|
39
|
+
try:
|
40
|
+
return self.__dict__[cache]
|
41
|
+
except KeyError:
|
42
|
+
#print 'miss'
|
43
|
+
value = callableobj(self, *args)
|
44
|
+
setattr(self, cache, value)
|
45
|
+
return value
|
46
|
+
cache_wrapper1.__doc__ = callableobj.__doc__
|
47
|
+
return cache_wrapper1
|
48
|
+
|
49
|
+
elif keyarg:
|
50
|
+
|
51
|
+
def cache_wrapper2(self, *args, **kwargs):
|
52
|
+
cache = '_%s_cache_' % callableobj.__name__
|
53
|
+
key = args[keyarg-1]
|
54
|
+
#print 'cache2?', cache, self, key
|
55
|
+
try:
|
56
|
+
_cache = self.__dict__[cache]
|
57
|
+
except KeyError:
|
58
|
+
#print 'init'
|
59
|
+
_cache = {}
|
60
|
+
setattr(self, cache, _cache)
|
61
|
+
try:
|
62
|
+
return _cache[key]
|
63
|
+
except KeyError:
|
64
|
+
#print 'miss', self, cache, key
|
65
|
+
_cache[key] = callableobj(self, *args, **kwargs)
|
66
|
+
return _cache[key]
|
67
|
+
cache_wrapper2.__doc__ = callableobj.__doc__
|
68
|
+
return cache_wrapper2
|
69
|
+
|
70
|
+
def cache_wrapper3(self, *args):
|
71
|
+
cache = '_%s_cache_' % callableobj.__name__
|
72
|
+
#print 'cache3?', cache, self, args
|
73
|
+
try:
|
74
|
+
_cache = self.__dict__[cache]
|
75
|
+
except KeyError:
|
76
|
+
#print 'init'
|
77
|
+
_cache = {}
|
78
|
+
setattr(self, cache, _cache)
|
79
|
+
try:
|
80
|
+
return _cache[args]
|
81
|
+
except KeyError:
|
82
|
+
#print 'miss'
|
83
|
+
_cache[args] = callableobj(self, *args)
|
84
|
+
return _cache[args]
|
85
|
+
cache_wrapper3.__doc__ = callableobj.__doc__
|
86
|
+
return cache_wrapper3
|
87
|
+
|
88
|
+
def clear_cache(obj, funcname):
|
89
|
+
"""Function to clear a cache handled by the cached decorator."""
|
90
|
+
try:
|
91
|
+
del obj.__dict__['_%s_cache_' % funcname]
|
92
|
+
except KeyError:
|
93
|
+
pass
|
94
|
+
|
95
|
+
def copy_cache(obj, funcname, cacheobj):
|
96
|
+
"""Copy cache for <funcname> from cacheobj to obj."""
|
97
|
+
cache = '_%s_cache_' % funcname
|
98
|
+
try:
|
99
|
+
setattr(obj, cache, cacheobj.__dict__[cache])
|
100
|
+
except KeyError:
|
101
|
+
pass
|
102
|
+
|
103
|
+
class wproperty(object):
|
104
|
+
"""Simple descriptor expecting to take a modifier function as first argument
|
105
|
+
and looking for a _<function name> to retrieve the attribute.
|
106
|
+
"""
|
107
|
+
def __init__(self, setfunc):
|
108
|
+
self.setfunc = setfunc
|
109
|
+
self.attrname = '_%s' % setfunc.__name__
|
110
|
+
|
111
|
+
def __set__(self, obj, value):
|
112
|
+
self.setfunc(obj, value)
|
113
|
+
|
114
|
+
def __get__(self, obj, cls):
|
115
|
+
assert obj is not None
|
116
|
+
return getattr(obj, self.attrname)
|
117
|
+
|
118
|
+
|
119
|
+
class classproperty(object):
|
120
|
+
"""this is a simple property-like class but for class attributes.
|
121
|
+
"""
|
122
|
+
def __init__(self, get):
|
123
|
+
self.get = get
|
124
|
+
def __get__(self, inst, cls):
|
125
|
+
return self.get(cls)
|
126
|
+
|
127
|
+
|
128
|
+
class iclassmethod(object):
|
129
|
+
'''Descriptor for method which should be available as class method if called
|
130
|
+
on the class or instance method if called on an instance.
|
131
|
+
'''
|
132
|
+
def __init__(self, func):
|
133
|
+
self.func = func
|
134
|
+
def __get__(self, instance, objtype):
|
135
|
+
if instance is None:
|
136
|
+
return MethodType(self.func, objtype, objtype.__class__)
|
137
|
+
return MethodType(self.func, instance, objtype)
|
138
|
+
def __set__(self, instance, value):
|
139
|
+
raise AttributeError("can't set attribute")
|
140
|
+
|
141
|
+
|
142
|
+
def timed(f):
|
143
|
+
def wrap(*args, **kwargs):
|
144
|
+
t = time()
|
145
|
+
c = clock()
|
146
|
+
res = f(*args, **kwargs)
|
147
|
+
print '%s clock: %.9f / time: %.9f' % (f.__name__,
|
148
|
+
clock() - c, time() - t)
|
149
|
+
return res
|
150
|
+
return wrap
|
151
|
+
|
152
|
+
|
153
|
+
def locked(acquire, release):
|
154
|
+
"""Decorator taking two methods to acquire/release a lock as argument,
|
155
|
+
returning a decorator function which will call the inner method after
|
156
|
+
having called acquire(self) et will call release(self) afterwards.
|
157
|
+
"""
|
158
|
+
def decorator(f):
|
159
|
+
def wrapper(self, *args, **kwargs):
|
160
|
+
acquire(self)
|
161
|
+
try:
|
162
|
+
return f(self, *args, **kwargs)
|
163
|
+
finally:
|
164
|
+
release(self)
|
165
|
+
return wrapper
|
166
|
+
return decorator
|
167
|
+
|
168
|
+
|
169
|
+
def monkeypatch(klass, methodname=None):
|
170
|
+
"""Decorator extending class with the decorated function
|
171
|
+
>>> class A:
|
172
|
+
... pass
|
173
|
+
>>> @monkeypatch(A)
|
174
|
+
... def meth(self):
|
175
|
+
... return 12
|
176
|
+
...
|
177
|
+
>>> a = A()
|
178
|
+
>>> a.meth()
|
179
|
+
12
|
180
|
+
>>> @monkeypatch(A, 'foo')
|
181
|
+
... def meth(self):
|
182
|
+
... return 12
|
183
|
+
...
|
184
|
+
>>> a.foo()
|
185
|
+
12
|
186
|
+
"""
|
187
|
+
def decorator(func):
|
188
|
+
setattr(klass, methodname or func.__name__, func)
|
189
|
+
return func
|
190
|
+
return decorator
|