bee_python 0.0.3 → 0.0.4
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/{build/README → README} +1 -1
- data/egg/egg/build.yml +11 -49
- data/egg/egg.yml +19 -27
- data/egg/http/build.erb +32 -36
- data/egg/http/libhttp.py +102 -0
- data/egg/http/pylint.cfg +236 -0
- data/egg/http/server.py +7 -0
- data/egg/http/test.erb +32 -0
- data/egg/http.yml +33 -29
- data/egg/mysql/mysql.py +8 -9
- data/egg/project/build.erb +21 -53
- data/egg/project/pylint.cfg +236 -0
- data/egg/project/test.py +2 -2
- data/egg/project.yml +23 -31
- data/egg/script/build.erb +18 -23
- data/egg/script/pylint.cfg +236 -0
- data/egg/script.yml +22 -18
- data/egg/source/source.py +6 -6
- data/egg/test/test.py +1 -1
- data/lib/bee_task_python.rb +3 -34
- data/python.yml +123 -0
- metadata +61 -503
- data/test/build.yml +0 -16
- data/test/tc_bee_task_python.rb +0 -27
- data/test/test_build.rb +0 -26
- data/test/test_build_listener.rb +0 -110
- data/test/ts_bee_python.rb +0 -26
- data/tools/common/__init__.py +0 -5
- data/tools/common/common/__init__.py +0 -140
- data/tools/common/common/__pkginfo__.py +0 -43
- data/tools/common/common/adbh.py +0 -35
- data/tools/common/common/cache.py +0 -114
- data/tools/common/common/changelog.py +0 -234
- data/tools/common/common/clcommands.py +0 -181
- data/tools/common/common/cli.py +0 -212
- data/tools/common/common/compat.py +0 -328
- data/tools/common/common/configuration.py +0 -1087
- data/tools/common/common/contexts.py +0 -58
- data/tools/common/common/corbautils.py +0 -117
- data/tools/common/common/daemon.py +0 -171
- data/tools/common/common/date.py +0 -279
- data/tools/common/common/db.py +0 -49
- data/tools/common/common/dbf.py +0 -229
- data/tools/common/common/debugger.py +0 -208
- data/tools/common/common/decorators.py +0 -190
- data/tools/common/common/deprecation.py +0 -118
- data/tools/common/common/fileutils.py +0 -409
- data/tools/common/common/graph.py +0 -259
- data/tools/common/common/html.py +0 -142
- data/tools/common/common/interface.py +0 -76
- data/tools/common/common/logging_ext.py +0 -166
- data/tools/common/common/modutils.py +0 -670
- data/tools/common/common/optik_ext.py +0 -383
- data/tools/common/common/optparser.py +0 -92
- data/tools/common/common/pdf_ext.py +0 -111
- data/tools/common/common/proc.py +0 -276
- data/tools/common/common/pyro_ext.py +0 -146
- data/tools/common/common/pytest.py +0 -754
- data/tools/common/common/shellutils.py +0 -383
- data/tools/common/common/sphinx_ext.py +0 -87
- data/tools/common/common/sphinxutils.py +0 -122
- data/tools/common/common/sqlgen.py +0 -31
- data/tools/common/common/table.py +0 -930
- data/tools/common/common/tasksqueue.py +0 -97
- data/tools/common/common/test/__init__.py +0 -1
- data/tools/common/common/test/data/ChangeLog +0 -184
- data/tools/common/common/test/data/MyPyPa-0.1.0-py2.5.egg +0 -0
- data/tools/common/common/test/data/__init__.py +0 -1
- data/tools/common/common/test/data/content_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/content_differ_dir/README +0 -1
- data/tools/common/common/test/data/content_differ_dir/subdir/coin +0 -1
- data/tools/common/common/test/data/content_differ_dir/subdir/toto.txt +0 -53
- data/tools/common/common/test/data/file_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/file_differ_dir/README +0 -1
- data/tools/common/common/test/data/file_differ_dir/subdir/toto.txt +0 -53
- 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 +0 -9
- data/tools/common/common/test/data/module.py +0 -88
- data/tools/common/common/test/data/module2.py +0 -77
- data/tools/common/common/test/data/newlines.txt +0 -3
- data/tools/common/common/test/data/noendingnewline.py +0 -36
- data/tools/common/common/test/data/nonregr.py +0 -14
- 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 +0 -1
- data/tools/common/common/test/data/reference_dir/subdir/coin +0 -1
- data/tools/common/common/test/data/reference_dir/subdir/toto.txt +0 -53
- data/tools/common/common/test/data/same_dir/NOTHING +0 -0
- data/tools/common/common/test/data/same_dir/README +0 -1
- data/tools/common/common/test/data/same_dir/subdir/coin +0 -1
- data/tools/common/common/test/data/same_dir/subdir/toto.txt +0 -53
- data/tools/common/common/test/data/spam.txt +0 -9
- data/tools/common/common/test/data/sub/doc.txt +0 -1
- data/tools/common/common/test/data/sub/momo.py +0 -1
- data/tools/common/common/test/data/subdir_differ_dir/NOTHING +0 -0
- data/tools/common/common/test/data/subdir_differ_dir/README +0 -1
- data/tools/common/common/test/data/subdir_differ_dir/subdir/coin +0 -1
- data/tools/common/common/test/data/subdir_differ_dir/subdir/toto.txt +0 -53
- data/tools/common/common/test/data/test.ini +0 -20
- data/tools/common/common/test/data/test1.msg +0 -30
- data/tools/common/common/test/data/test2.msg +0 -42
- data/tools/common/common/test/data/write_protected_file.txt +0 -0
- data/tools/common/common/test/foomod.py +0 -17
- data/tools/common/common/test/unittest_cache.py +0 -129
- data/tools/common/common/test/unittest_changelog.py +0 -37
- data/tools/common/common/test/unittest_compat.py +0 -239
- data/tools/common/common/test/unittest_configuration.py +0 -348
- data/tools/common/common/test/unittest_date.py +0 -154
- data/tools/common/common/test/unittest_decorators.py +0 -62
- data/tools/common/common/test/unittest_deprecation.py +0 -76
- data/tools/common/common/test/unittest_fileutils.py +0 -133
- data/tools/common/common/test/unittest_graph.py +0 -50
- data/tools/common/common/test/unittest_html.py +0 -76
- data/tools/common/common/test/unittest_interface.py +0 -87
- data/tools/common/common/test/unittest_modutils.py +0 -244
- data/tools/common/common/test/unittest_pytest.py +0 -50
- data/tools/common/common/test/unittest_shellutils.py +0 -248
- data/tools/common/common/test/unittest_table.py +0 -448
- data/tools/common/common/test/unittest_taskqueue.py +0 -71
- data/tools/common/common/test/unittest_testlib.py +0 -956
- data/tools/common/common/test/unittest_textutils.py +0 -247
- data/tools/common/common/test/unittest_tree.py +0 -248
- data/tools/common/common/test/unittest_umessage.py +0 -55
- data/tools/common/common/test/unittest_ureports_html.py +0 -64
- data/tools/common/common/test/unittest_ureports_text.py +0 -105
- data/tools/common/common/test/unittest_xmlutils.py +0 -75
- data/tools/common/common/test/utils.py +0 -87
- data/tools/common/common/testlib.py +0 -1927
- data/tools/common/common/textutils.py +0 -476
- data/tools/common/common/tree.py +0 -372
- data/tools/common/common/umessage.py +0 -161
- data/tools/common/common/ureports/__init__.py +0 -174
- data/tools/common/common/ureports/docbook_writer.py +0 -139
- data/tools/common/common/ureports/html_writer.py +0 -131
- data/tools/common/common/ureports/nodes.py +0 -201
- data/tools/common/common/ureports/text_writer.py +0 -140
- data/tools/common/common/vcgutils.py +0 -216
- data/tools/common/common/visitor.py +0 -107
- data/tools/common/common/xmlrpcutils.py +0 -136
- data/tools/common/common/xmlutils.py +0 -61
- data/tools/coverage/coverage.py +0 -602
- data/tools/epydoc/__init__.py +0 -227
- data/tools/epydoc/__init__.pyc +0 -0
- data/tools/epydoc/apidoc.py +0 -2203
- data/tools/epydoc/apidoc.pyc +0 -0
- data/tools/epydoc/checker.py +0 -349
- data/tools/epydoc/checker.pyc +0 -0
- data/tools/epydoc/cli.py +0 -1470
- data/tools/epydoc/cli.pyc +0 -0
- data/tools/epydoc/compat.py +0 -250
- data/tools/epydoc/compat.pyc +0 -0
- data/tools/epydoc/docbuilder.py +0 -1358
- data/tools/epydoc/docbuilder.pyc +0 -0
- data/tools/epydoc/docintrospecter.py +0 -1056
- data/tools/epydoc/docintrospecter.pyc +0 -0
- data/tools/epydoc/docparser.py +0 -2113
- data/tools/epydoc/docparser.pyc +0 -0
- data/tools/epydoc/docstringparser.py +0 -1111
- data/tools/epydoc/docstringparser.pyc +0 -0
- data/tools/epydoc/docwriter/__init__.py +0 -12
- data/tools/epydoc/docwriter/__init__.pyc +0 -0
- data/tools/epydoc/docwriter/dotgraph.py +0 -1351
- data/tools/epydoc/docwriter/dotgraph.pyc +0 -0
- data/tools/epydoc/docwriter/html.py +0 -3491
- data/tools/epydoc/docwriter/html.pyc +0 -0
- data/tools/epydoc/docwriter/html_colorize.py +0 -909
- data/tools/epydoc/docwriter/html_colorize.pyc +0 -0
- data/tools/epydoc/docwriter/html_css.py +0 -550
- data/tools/epydoc/docwriter/html_css.pyc +0 -0
- data/tools/epydoc/docwriter/html_help.py +0 -190
- data/tools/epydoc/docwriter/html_help.pyc +0 -0
- data/tools/epydoc/docwriter/latex.py +0 -1187
- data/tools/epydoc/docwriter/latex.pyc +0 -0
- data/tools/epydoc/docwriter/plaintext.py +0 -276
- data/tools/epydoc/docwriter/plaintext.pyc +0 -0
- data/tools/epydoc/docwriter/xlink.py +0 -505
- data/tools/epydoc/docwriter/xlink.pyc +0 -0
- data/tools/epydoc/gui.py +0 -1148
- data/tools/epydoc/gui.pyc +0 -0
- data/tools/epydoc/log.py +0 -204
- data/tools/epydoc/log.pyc +0 -0
- data/tools/epydoc/markup/__init__.py +0 -623
- data/tools/epydoc/markup/__init__.pyc +0 -0
- data/tools/epydoc/markup/doctest.py +0 -311
- data/tools/epydoc/markup/doctest.pyc +0 -0
- data/tools/epydoc/markup/epytext.py +0 -2116
- data/tools/epydoc/markup/epytext.pyc +0 -0
- data/tools/epydoc/markup/javadoc.py +0 -250
- data/tools/epydoc/markup/javadoc.pyc +0 -0
- data/tools/epydoc/markup/plaintext.py +0 -78
- data/tools/epydoc/markup/plaintext.pyc +0 -0
- data/tools/epydoc/markup/pyval_repr.py +0 -532
- data/tools/epydoc/markup/pyval_repr.pyc +0 -0
- data/tools/epydoc/markup/restructuredtext.py +0 -906
- data/tools/epydoc/markup/restructuredtext.pyc +0 -0
- data/tools/epydoc/test/__init__.py +0 -97
- data/tools/epydoc/test/__init__.pyc +0 -0
- data/tools/epydoc/test/util.py +0 -226
- data/tools/epydoc/test/util.pyc +0 -0
- data/tools/epydoc/util.py +0 -289
- data/tools/epydoc/util.pyc +0 -0
- data/tools/logilab/logilab/__init__.py +0 -5
- data/tools/logilab/logilab/astng/__init__.py +0 -82
- data/tools/logilab/logilab/astng/__pkginfo__.py +0 -76
- data/tools/logilab/logilab/astng/_exceptions.py +0 -64
- data/tools/logilab/logilab/astng/_nodes_ast.py +0 -667
- data/tools/logilab/logilab/astng/_nodes_compiler.py +0 -758
- data/tools/logilab/logilab/astng/bases.py +0 -608
- data/tools/logilab/logilab/astng/builder.py +0 -239
- data/tools/logilab/logilab/astng/inference.py +0 -426
- data/tools/logilab/logilab/astng/inspector.py +0 -289
- data/tools/logilab/logilab/astng/manager.py +0 -421
- data/tools/logilab/logilab/astng/mixins.py +0 -165
- data/tools/logilab/logilab/astng/node_classes.py +0 -848
- data/tools/logilab/logilab/astng/nodes.py +0 -85
- data/tools/logilab/logilab/astng/nodes_as_string.py +0 -389
- data/tools/logilab/logilab/astng/patchcomptransformer.py +0 -159
- data/tools/logilab/logilab/astng/protocols.py +0 -333
- data/tools/logilab/logilab/astng/raw_building.py +0 -212
- data/tools/logilab/logilab/astng/rebuilder.py +0 -307
- data/tools/logilab/logilab/astng/scoped_nodes.py +0 -951
- data/tools/logilab/logilab/astng/test/__init__.py +0 -19
- 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 +0 -33
- data/tools/logilab/logilab/astng/test/data/SSL1/__init__.py +0 -20
- data/tools/logilab/logilab/astng/test/data/__init__.py +0 -20
- data/tools/logilab/logilab/astng/test/data/all.py +0 -29
- data/tools/logilab/logilab/astng/test/data/appl/__init__.py +0 -23
- data/tools/logilab/logilab/astng/test/data/appl/myConnection.py +0 -30
- data/tools/logilab/logilab/astng/test/data/format.py +0 -34
- data/tools/logilab/logilab/astng/test/data/module.py +0 -90
- data/tools/logilab/logilab/astng/test/data/module2.py +0 -112
- data/tools/logilab/logilab/astng/test/data/noendingnewline.py +0 -57
- data/tools/logilab/logilab/astng/test/data/nonregr.py +0 -76
- data/tools/logilab/logilab/astng/test/data/notall.py +0 -28
- data/tools/logilab/logilab/astng/test/data2/__init__.py +0 -20
- data/tools/logilab/logilab/astng/test/data2/clientmodule_test.py +0 -51
- data/tools/logilab/logilab/astng/test/data2/suppliermodule_test.py +0 -32
- data/tools/logilab/logilab/astng/test/regrtest.py +0 -135
- data/tools/logilab/logilab/astng/test/regrtest_data/absimport.py +0 -22
- data/tools/logilab/logilab/astng/test/regrtest_data/descriptor_crash.py +0 -31
- data/tools/logilab/logilab/astng/test/regrtest_data/import_package_subpackage_module.py +0 -68
- data/tools/logilab/logilab/astng/test/regrtest_data/package/__init__.py +0 -24
- data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/__init__.py +0 -20
- data/tools/logilab/logilab/astng/test/regrtest_data/package/subpackage/module.py +0 -20
- data/tools/logilab/logilab/astng/test/unittest_builder.py +0 -684
- data/tools/logilab/logilab/astng/test/unittest_inference.py +0 -1112
- data/tools/logilab/logilab/astng/test/unittest_inspector.py +0 -105
- data/tools/logilab/logilab/astng/test/unittest_lookup.py +0 -302
- data/tools/logilab/logilab/astng/test/unittest_manager.py +0 -98
- data/tools/logilab/logilab/astng/test/unittest_nodes.py +0 -302
- data/tools/logilab/logilab/astng/test/unittest_scoped_nodes.py +0 -501
- data/tools/logilab/logilab/astng/test/unittest_utils.py +0 -104
- data/tools/logilab/logilab/astng/utils.py +0 -342
- data/tools/logilab/logilab/common/__init__.py +0 -140
- data/tools/logilab/logilab/common/__pkginfo__.py +0 -43
- data/tools/logilab/logilab/common/adbh.py +0 -35
- data/tools/logilab/logilab/common/cache.py +0 -114
- data/tools/logilab/logilab/common/changelog.py +0 -234
- data/tools/logilab/logilab/common/clcommands.py +0 -181
- data/tools/logilab/logilab/common/cli.py +0 -212
- data/tools/logilab/logilab/common/compat.py +0 -328
- data/tools/logilab/logilab/common/configuration.py +0 -1087
- data/tools/logilab/logilab/common/contexts.py +0 -58
- data/tools/logilab/logilab/common/corbautils.py +0 -117
- data/tools/logilab/logilab/common/daemon.py +0 -171
- data/tools/logilab/logilab/common/date.py +0 -279
- data/tools/logilab/logilab/common/db.py +0 -49
- data/tools/logilab/logilab/common/dbf.py +0 -229
- data/tools/logilab/logilab/common/debugger.py +0 -208
- data/tools/logilab/logilab/common/decorators.py +0 -190
- data/tools/logilab/logilab/common/deprecation.py +0 -118
- data/tools/logilab/logilab/common/fileutils.py +0 -409
- data/tools/logilab/logilab/common/graph.py +0 -259
- data/tools/logilab/logilab/common/html.py +0 -142
- data/tools/logilab/logilab/common/interface.py +0 -76
- data/tools/logilab/logilab/common/logging_ext.py +0 -166
- data/tools/logilab/logilab/common/modutils.py +0 -670
- data/tools/logilab/logilab/common/optik_ext.py +0 -383
- data/tools/logilab/logilab/common/optparser.py +0 -92
- data/tools/logilab/logilab/common/pdf_ext.py +0 -111
- data/tools/logilab/logilab/common/proc.py +0 -276
- data/tools/logilab/logilab/common/pyro_ext.py +0 -146
- data/tools/logilab/logilab/common/pytest.py +0 -754
- data/tools/logilab/logilab/common/shellutils.py +0 -383
- data/tools/logilab/logilab/common/sphinx_ext.py +0 -87
- data/tools/logilab/logilab/common/sphinxutils.py +0 -122
- data/tools/logilab/logilab/common/sqlgen.py +0 -31
- data/tools/logilab/logilab/common/table.py +0 -930
- data/tools/logilab/logilab/common/tasksqueue.py +0 -97
- data/tools/logilab/logilab/common/test/__init__.py +0 -1
- data/tools/logilab/logilab/common/test/data/ChangeLog +0 -184
- 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 +0 -1
- data/tools/logilab/logilab/common/test/data/content_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/content_differ_dir/README +0 -1
- data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/coin +0 -1
- data/tools/logilab/logilab/common/test/data/content_differ_dir/subdir/toto.txt +0 -53
- data/tools/logilab/logilab/common/test/data/file_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/file_differ_dir/README +0 -1
- data/tools/logilab/logilab/common/test/data/file_differ_dir/subdir/toto.txt +0 -53
- 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 +0 -9
- data/tools/logilab/logilab/common/test/data/module.py +0 -88
- data/tools/logilab/logilab/common/test/data/module2.py +0 -77
- data/tools/logilab/logilab/common/test/data/newlines.txt +0 -3
- data/tools/logilab/logilab/common/test/data/noendingnewline.py +0 -36
- data/tools/logilab/logilab/common/test/data/nonregr.py +0 -14
- 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 +0 -1
- data/tools/logilab/logilab/common/test/data/reference_dir/subdir/coin +0 -1
- data/tools/logilab/logilab/common/test/data/reference_dir/subdir/toto.txt +0 -53
- data/tools/logilab/logilab/common/test/data/same_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/same_dir/README +0 -1
- data/tools/logilab/logilab/common/test/data/same_dir/subdir/coin +0 -1
- data/tools/logilab/logilab/common/test/data/same_dir/subdir/toto.txt +0 -53
- data/tools/logilab/logilab/common/test/data/spam.txt +0 -9
- data/tools/logilab/logilab/common/test/data/sub/doc.txt +0 -1
- data/tools/logilab/logilab/common/test/data/sub/momo.py +0 -1
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/NOTHING +0 -0
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/README +0 -1
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/coin +0 -1
- data/tools/logilab/logilab/common/test/data/subdir_differ_dir/subdir/toto.txt +0 -53
- data/tools/logilab/logilab/common/test/data/test.ini +0 -20
- data/tools/logilab/logilab/common/test/data/test1.msg +0 -30
- data/tools/logilab/logilab/common/test/data/test2.msg +0 -42
- data/tools/logilab/logilab/common/test/data/write_protected_file.txt +0 -0
- data/tools/logilab/logilab/common/test/foomod.py +0 -17
- data/tools/logilab/logilab/common/test/unittest_cache.py +0 -129
- data/tools/logilab/logilab/common/test/unittest_changelog.py +0 -37
- data/tools/logilab/logilab/common/test/unittest_compat.py +0 -239
- data/tools/logilab/logilab/common/test/unittest_configuration.py +0 -348
- data/tools/logilab/logilab/common/test/unittest_date.py +0 -154
- data/tools/logilab/logilab/common/test/unittest_decorators.py +0 -62
- data/tools/logilab/logilab/common/test/unittest_deprecation.py +0 -76
- data/tools/logilab/logilab/common/test/unittest_fileutils.py +0 -133
- data/tools/logilab/logilab/common/test/unittest_graph.py +0 -50
- data/tools/logilab/logilab/common/test/unittest_html.py +0 -76
- data/tools/logilab/logilab/common/test/unittest_interface.py +0 -87
- data/tools/logilab/logilab/common/test/unittest_modutils.py +0 -244
- data/tools/logilab/logilab/common/test/unittest_pytest.py +0 -50
- data/tools/logilab/logilab/common/test/unittest_shellutils.py +0 -248
- data/tools/logilab/logilab/common/test/unittest_table.py +0 -448
- data/tools/logilab/logilab/common/test/unittest_taskqueue.py +0 -71
- data/tools/logilab/logilab/common/test/unittest_testlib.py +0 -956
- data/tools/logilab/logilab/common/test/unittest_textutils.py +0 -247
- data/tools/logilab/logilab/common/test/unittest_tree.py +0 -248
- data/tools/logilab/logilab/common/test/unittest_umessage.py +0 -55
- data/tools/logilab/logilab/common/test/unittest_ureports_html.py +0 -64
- data/tools/logilab/logilab/common/test/unittest_ureports_text.py +0 -105
- data/tools/logilab/logilab/common/test/unittest_xmlutils.py +0 -75
- data/tools/logilab/logilab/common/test/utils.py +0 -87
- data/tools/logilab/logilab/common/testlib.py +0 -1927
- data/tools/logilab/logilab/common/textutils.py +0 -476
- data/tools/logilab/logilab/common/tree.py +0 -372
- data/tools/logilab/logilab/common/umessage.py +0 -161
- data/tools/logilab/logilab/common/ureports/__init__.py +0 -174
- data/tools/logilab/logilab/common/ureports/docbook_writer.py +0 -139
- data/tools/logilab/logilab/common/ureports/html_writer.py +0 -131
- data/tools/logilab/logilab/common/ureports/nodes.py +0 -201
- data/tools/logilab/logilab/common/ureports/text_writer.py +0 -140
- data/tools/logilab/logilab/common/vcgutils.py +0 -216
- data/tools/logilab/logilab/common/visitor.py +0 -107
- data/tools/logilab/logilab/common/xmlrpcutils.py +0 -136
- data/tools/logilab/logilab/common/xmlutils.py +0 -61
- data/tools/pychecker/COPYRIGHT +0 -31
- data/tools/pychecker/ChangeLog +0 -349
- data/tools/pychecker/CodeChecks.py +0 -1969
- data/tools/pychecker/CodeChecks.pyc +0 -0
- data/tools/pychecker/CodeChecks.pyo +0 -0
- data/tools/pychecker/Config.py +0 -475
- data/tools/pychecker/Config.pyc +0 -0
- data/tools/pychecker/Config.pyo +0 -0
- data/tools/pychecker/KNOWN_BUGS +0 -100
- data/tools/pychecker/MAINTAINERS +0 -81
- data/tools/pychecker/NEWS +0 -406
- data/tools/pychecker/OP.py +0 -131
- data/tools/pychecker/OP.pyc +0 -0
- data/tools/pychecker/OP.pyo +0 -0
- data/tools/pychecker/OptionTypes.py +0 -117
- data/tools/pychecker/OptionTypes.pyc +0 -0
- data/tools/pychecker/OptionTypes.pyo +0 -0
- data/tools/pychecker/README +0 -152
- data/tools/pychecker/Stack.py +0 -115
- data/tools/pychecker/Stack.pyc +0 -0
- data/tools/pychecker/Stack.pyo +0 -0
- data/tools/pychecker/TODO +0 -101
- data/tools/pychecker/VERSION +0 -1
- data/tools/pychecker/Warning.py +0 -50
- data/tools/pychecker/Warning.pyc +0 -0
- data/tools/pychecker/Warning.pyo +0 -0
- data/tools/pychecker/__init__.py +0 -17
- data/tools/pychecker/__init__.pyc +0 -0
- data/tools/pychecker/__init__.pyo +0 -0
- data/tools/pychecker/checker.py +0 -961
- data/tools/pychecker/checker.pyc +0 -0
- data/tools/pychecker/checker.pyo +0 -0
- data/tools/pychecker/function.py +0 -159
- data/tools/pychecker/function.pyc +0 -0
- data/tools/pychecker/function.pyo +0 -0
- data/tools/pychecker/msgs.py +0 -175
- data/tools/pychecker/msgs.pyc +0 -0
- data/tools/pychecker/msgs.pyo +0 -0
- data/tools/pychecker/options.py +0 -275
- data/tools/pychecker/options.pyc +0 -0
- data/tools/pychecker/options.pyo +0 -0
- data/tools/pychecker/pcmodules.py +0 -19
- data/tools/pychecker/pcmodules.pyc +0 -0
- data/tools/pychecker/pcmodules.pyo +0 -0
- data/tools/pychecker/printer.py +0 -47
- data/tools/pychecker/printer.pyc +0 -0
- data/tools/pychecker/printer.pyo +0 -0
- data/tools/pychecker/python.py +0 -427
- data/tools/pychecker/python.pyc +0 -0
- data/tools/pychecker/python.pyo +0 -0
- data/tools/pychecker/utils.py +0 -102
- data/tools/pychecker/utils.pyc +0 -0
- data/tools/pychecker/utils.pyo +0 -0
- data/tools/pychecker/warn.py +0 -778
- data/tools/pychecker/warn.pyc +0 -0
- data/tools/pychecker/warn.pyo +0 -0
- data/tools/pylint2/pylint/__init__.py +0 -16
- data/tools/pylint2/pylint/__pkginfo__.py +0 -67
- data/tools/pylint2/pylint/checkers/__init__.py +0 -155
- data/tools/pylint2/pylint/checkers/base.py +0 -749
- data/tools/pylint2/pylint/checkers/classes.py +0 -527
- data/tools/pylint2/pylint/checkers/design_analysis.py +0 -344
- data/tools/pylint2/pylint/checkers/exceptions.py +0 -183
- data/tools/pylint2/pylint/checkers/format.py +0 -367
- data/tools/pylint2/pylint/checkers/imports.py +0 -379
- data/tools/pylint2/pylint/checkers/logging.py +0 -98
- data/tools/pylint2/pylint/checkers/misc.py +0 -128
- data/tools/pylint2/pylint/checkers/newstyle.py +0 -107
- data/tools/pylint2/pylint/checkers/raw_metrics.py +0 -125
- data/tools/pylint2/pylint/checkers/similar.py +0 -333
- data/tools/pylint2/pylint/checkers/string_format.py +0 -239
- data/tools/pylint2/pylint/checkers/typecheck.py +0 -364
- data/tools/pylint2/pylint/checkers/utils.py +0 -208
- data/tools/pylint2/pylint/checkers/variables.py +0 -498
- data/tools/pylint2/pylint/config.py +0 -149
- data/tools/pylint2/pylint/epylint.py +0 -149
- data/tools/pylint2/pylint/gui.py +0 -433
- data/tools/pylint2/pylint/interfaces.py +0 -98
- data/tools/pylint2/pylint/lint.py +0 -914
- data/tools/pylint2/pylint/pyreverse/__init__.py +0 -5
- data/tools/pylint2/pylint/pyreverse/diadefslib.py +0 -229
- data/tools/pylint2/pylint/pyreverse/diagrams.py +0 -247
- data/tools/pylint2/pylint/pyreverse/main.py +0 -123
- data/tools/pylint2/pylint/pyreverse/utils.py +0 -131
- data/tools/pylint2/pylint/pyreverse/writer.py +0 -196
- data/tools/pylint2/pylint/reporters/__init__.py +0 -67
- data/tools/pylint2/pylint/reporters/guireporter.py +0 -36
- data/tools/pylint2/pylint/reporters/html.py +0 -69
- data/tools/pylint2/pylint/reporters/text.py +0 -156
- data/tools/pylint2/pylint/utils.py +0 -518
- data/tools/pylint2/pylint.py +0 -16
@@ -1,372 +0,0 @@
|
|
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
|
-
"""Base class to represent a tree structure.
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
"""
|
24
|
-
__docformat__ = "restructuredtext en"
|
25
|
-
|
26
|
-
import sys
|
27
|
-
|
28
|
-
from logilab.common import flatten
|
29
|
-
from logilab.common.visitor import VisitedMixIn, FilteredIterator, no_filter
|
30
|
-
|
31
|
-
## Exceptions #################################################################
|
32
|
-
|
33
|
-
class NodeNotFound(Exception):
|
34
|
-
"""raised when a node has not been found"""
|
35
|
-
|
36
|
-
EX_SIBLING_NOT_FOUND = "No such sibling as '%s'"
|
37
|
-
EX_CHILD_NOT_FOUND = "No such child as '%s'"
|
38
|
-
EX_NODE_NOT_FOUND = "No such node as '%s'"
|
39
|
-
|
40
|
-
|
41
|
-
# Base node ###################################################################
|
42
|
-
|
43
|
-
class Node(object):
|
44
|
-
"""a basic tree node, characterized by an id"""
|
45
|
-
|
46
|
-
def __init__(self, nid=None) :
|
47
|
-
self.id = nid
|
48
|
-
# navigation
|
49
|
-
self.parent = None
|
50
|
-
self.children = []
|
51
|
-
|
52
|
-
def __iter__(self):
|
53
|
-
return iter(self.children)
|
54
|
-
|
55
|
-
def __str__(self, indent=0):
|
56
|
-
s = ['%s%s %s' % (' '*indent, self.__class__.__name__, self.id)]
|
57
|
-
indent += 2
|
58
|
-
for child in self.children:
|
59
|
-
try:
|
60
|
-
s.append(child.__str__(indent))
|
61
|
-
except TypeError:
|
62
|
-
s.append(child.__str__())
|
63
|
-
return '\n'.join(s)
|
64
|
-
|
65
|
-
def is_leaf(self):
|
66
|
-
return not self.children
|
67
|
-
|
68
|
-
def append(self, child):
|
69
|
-
"""add a node to children"""
|
70
|
-
self.children.append(child)
|
71
|
-
child.parent = self
|
72
|
-
|
73
|
-
def remove(self, child):
|
74
|
-
"""remove a child node"""
|
75
|
-
self.children.remove(child)
|
76
|
-
child.parent = None
|
77
|
-
|
78
|
-
def insert(self, index, child):
|
79
|
-
"""insert a child node"""
|
80
|
-
self.children.insert(index, child)
|
81
|
-
child.parent = self
|
82
|
-
|
83
|
-
def replace(self, old_child, new_child):
|
84
|
-
"""replace a child node with another"""
|
85
|
-
i = self.children.index(old_child)
|
86
|
-
self.children.pop(i)
|
87
|
-
self.children.insert(i, new_child)
|
88
|
-
new_child.parent = self
|
89
|
-
|
90
|
-
def get_sibling(self, nid):
|
91
|
-
"""return the sibling node that has given id"""
|
92
|
-
try:
|
93
|
-
return self.parent.get_child_by_id(nid)
|
94
|
-
except NodeNotFound :
|
95
|
-
raise NodeNotFound(EX_SIBLING_NOT_FOUND % nid)
|
96
|
-
|
97
|
-
def next_sibling(self):
|
98
|
-
"""
|
99
|
-
return the next sibling for this node if any
|
100
|
-
"""
|
101
|
-
parent = self.parent
|
102
|
-
if parent is None:
|
103
|
-
# root node has no sibling
|
104
|
-
return None
|
105
|
-
index = parent.children.index(self)
|
106
|
-
try:
|
107
|
-
return parent.children[index+1]
|
108
|
-
except IndexError:
|
109
|
-
return None
|
110
|
-
|
111
|
-
def previous_sibling(self):
|
112
|
-
"""
|
113
|
-
return the previous sibling for this node if any
|
114
|
-
"""
|
115
|
-
parent = self.parent
|
116
|
-
if parent is None:
|
117
|
-
# root node has no sibling
|
118
|
-
return None
|
119
|
-
index = parent.children.index(self)
|
120
|
-
if index > 0:
|
121
|
-
return parent.children[index-1]
|
122
|
-
return None
|
123
|
-
|
124
|
-
def get_node_by_id(self, nid):
|
125
|
-
"""
|
126
|
-
return node in whole hierarchy that has given id
|
127
|
-
"""
|
128
|
-
root = self.root()
|
129
|
-
try:
|
130
|
-
return root.get_child_by_id(nid, 1)
|
131
|
-
except NodeNotFound :
|
132
|
-
raise NodeNotFound(EX_NODE_NOT_FOUND % nid)
|
133
|
-
|
134
|
-
def get_child_by_id(self, nid, recurse=None):
|
135
|
-
"""
|
136
|
-
return child of given id
|
137
|
-
"""
|
138
|
-
if self.id == nid:
|
139
|
-
return self
|
140
|
-
for c in self.children :
|
141
|
-
if recurse:
|
142
|
-
try:
|
143
|
-
return c.get_child_by_id(nid, 1)
|
144
|
-
except NodeNotFound :
|
145
|
-
continue
|
146
|
-
if c.id == nid :
|
147
|
-
return c
|
148
|
-
raise NodeNotFound(EX_CHILD_NOT_FOUND % nid)
|
149
|
-
|
150
|
-
def get_child_by_path(self, path):
|
151
|
-
"""
|
152
|
-
return child of given path (path is a list of ids)
|
153
|
-
"""
|
154
|
-
if len(path) > 0 and path[0] == self.id:
|
155
|
-
if len(path) == 1 :
|
156
|
-
return self
|
157
|
-
else :
|
158
|
-
for c in self.children :
|
159
|
-
try:
|
160
|
-
return c.get_child_by_path(path[1:])
|
161
|
-
except NodeNotFound :
|
162
|
-
pass
|
163
|
-
raise NodeNotFound(EX_CHILD_NOT_FOUND % path)
|
164
|
-
|
165
|
-
def depth(self):
|
166
|
-
"""
|
167
|
-
return depth of this node in the tree
|
168
|
-
"""
|
169
|
-
if self.parent is not None:
|
170
|
-
return 1 + self.parent.depth()
|
171
|
-
else :
|
172
|
-
return 0
|
173
|
-
|
174
|
-
def depth_down(self):
|
175
|
-
"""
|
176
|
-
return depth of the tree from this node
|
177
|
-
"""
|
178
|
-
if self.children:
|
179
|
-
return 1 + max([c.depth_down() for c in self.children])
|
180
|
-
return 1
|
181
|
-
|
182
|
-
def width(self):
|
183
|
-
"""
|
184
|
-
return the width of the tree from this node
|
185
|
-
"""
|
186
|
-
return len(self.leaves())
|
187
|
-
|
188
|
-
def root(self):
|
189
|
-
"""
|
190
|
-
return the root node of the tree
|
191
|
-
"""
|
192
|
-
if self.parent is not None:
|
193
|
-
return self.parent.root()
|
194
|
-
return self
|
195
|
-
|
196
|
-
def leaves(self):
|
197
|
-
"""
|
198
|
-
return a list with all the leaves nodes descendant from this node
|
199
|
-
"""
|
200
|
-
leaves = []
|
201
|
-
if self.children:
|
202
|
-
for child in self.children:
|
203
|
-
leaves += child.leaves()
|
204
|
-
return leaves
|
205
|
-
else:
|
206
|
-
return [self]
|
207
|
-
|
208
|
-
def __iter__(self):
|
209
|
-
return iter(self.children)
|
210
|
-
|
211
|
-
def flatten(self, _list=None):
|
212
|
-
"""
|
213
|
-
return a list with all the nodes descendant from this node
|
214
|
-
"""
|
215
|
-
if _list is None:
|
216
|
-
_list = []
|
217
|
-
_list.append(self)
|
218
|
-
for c in self.children:
|
219
|
-
c.flatten(_list)
|
220
|
-
return _list
|
221
|
-
|
222
|
-
def lineage(self):
|
223
|
-
"""
|
224
|
-
return list of parents up to root node
|
225
|
-
"""
|
226
|
-
lst = [self]
|
227
|
-
if self.parent is not None:
|
228
|
-
lst.extend(self.parent.lineage())
|
229
|
-
return lst
|
230
|
-
|
231
|
-
class VNode(Node, VisitedMixIn):
|
232
|
-
"""a visitable node
|
233
|
-
"""
|
234
|
-
pass
|
235
|
-
|
236
|
-
|
237
|
-
class BinaryNode(VNode):
|
238
|
-
"""a binary node (i.e. only two children
|
239
|
-
"""
|
240
|
-
def __init__(self, lhs=None, rhs=None) :
|
241
|
-
VNode.__init__(self)
|
242
|
-
if lhs is not None or rhs is not None:
|
243
|
-
assert lhs and rhs
|
244
|
-
self.append(lhs)
|
245
|
-
self.append(rhs)
|
246
|
-
|
247
|
-
def remove(self, child):
|
248
|
-
"""remove the child and replace this node with the other child
|
249
|
-
"""
|
250
|
-
self.children.remove(child)
|
251
|
-
self.parent.replace(self, self.children[0])
|
252
|
-
|
253
|
-
def get_parts(self):
|
254
|
-
"""
|
255
|
-
return the left hand side and the right hand side of this node
|
256
|
-
"""
|
257
|
-
return self.children[0], self.children[1]
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
if sys.version_info[0:2] >= (2, 2):
|
262
|
-
list_class = list
|
263
|
-
else:
|
264
|
-
from UserList import UserList
|
265
|
-
list_class = UserList
|
266
|
-
|
267
|
-
class ListNode(VNode, list_class):
|
268
|
-
"""Used to manipulate Nodes as Lists
|
269
|
-
"""
|
270
|
-
def __init__(self):
|
271
|
-
list_class.__init__(self)
|
272
|
-
VNode.__init__(self)
|
273
|
-
self.children = self
|
274
|
-
|
275
|
-
def __str__(self, indent=0):
|
276
|
-
return '%s%s %s' % (indent*' ', self.__class__.__name__,
|
277
|
-
', '.join([str(v) for v in self]))
|
278
|
-
|
279
|
-
def append(self, child):
|
280
|
-
"""add a node to children"""
|
281
|
-
list_class.append(self, child)
|
282
|
-
child.parent = self
|
283
|
-
|
284
|
-
def insert(self, index, child):
|
285
|
-
"""add a node to children"""
|
286
|
-
list_class.insert(self, index, child)
|
287
|
-
child.parent = self
|
288
|
-
|
289
|
-
def remove(self, child):
|
290
|
-
"""add a node to children"""
|
291
|
-
list_class.remove(self, child)
|
292
|
-
child.parent = None
|
293
|
-
|
294
|
-
def pop(self, index):
|
295
|
-
"""add a node to children"""
|
296
|
-
child = list_class.pop(self, index)
|
297
|
-
child.parent = None
|
298
|
-
|
299
|
-
def __iter__(self):
|
300
|
-
return list_class.__iter__(self)
|
301
|
-
|
302
|
-
# construct list from tree ####################################################
|
303
|
-
|
304
|
-
def post_order_list(node, filter_func=no_filter):
|
305
|
-
"""
|
306
|
-
create a list with tree nodes for which the <filter> function returned true
|
307
|
-
in a post order fashion
|
308
|
-
"""
|
309
|
-
l, stack = [], []
|
310
|
-
poped, index = 0, 0
|
311
|
-
while node:
|
312
|
-
if filter_func(node):
|
313
|
-
if node.children and not poped:
|
314
|
-
stack.append((node, index))
|
315
|
-
index = 0
|
316
|
-
node = node.children[0]
|
317
|
-
else:
|
318
|
-
l.append(node)
|
319
|
-
index += 1
|
320
|
-
try:
|
321
|
-
node = stack[-1][0].children[index]
|
322
|
-
except IndexError:
|
323
|
-
node = None
|
324
|
-
else:
|
325
|
-
node = None
|
326
|
-
poped = 0
|
327
|
-
if node is None and stack:
|
328
|
-
node, index = stack.pop()
|
329
|
-
poped = 1
|
330
|
-
return l
|
331
|
-
|
332
|
-
def pre_order_list(node, filter_func=no_filter):
|
333
|
-
"""
|
334
|
-
create a list with tree nodes for which the <filter> function returned true
|
335
|
-
in a pre order fashion
|
336
|
-
"""
|
337
|
-
l, stack = [], []
|
338
|
-
poped, index = 0, 0
|
339
|
-
while node:
|
340
|
-
if filter_func(node):
|
341
|
-
if not poped:
|
342
|
-
l.append(node)
|
343
|
-
if node.children and not poped:
|
344
|
-
stack.append((node, index))
|
345
|
-
index = 0
|
346
|
-
node = node.children[0]
|
347
|
-
else:
|
348
|
-
index += 1
|
349
|
-
try:
|
350
|
-
node = stack[-1][0].children[index]
|
351
|
-
except IndexError:
|
352
|
-
node = None
|
353
|
-
else:
|
354
|
-
node = None
|
355
|
-
poped = 0
|
356
|
-
if node is None and len(stack) > 1:
|
357
|
-
node, index = stack.pop()
|
358
|
-
poped = 1
|
359
|
-
return l
|
360
|
-
|
361
|
-
class PostfixedDepthFirstIterator(FilteredIterator):
|
362
|
-
"""a postfixed depth first iterator, designed to be used with visitors
|
363
|
-
"""
|
364
|
-
def __init__(self, node, filter_func=None):
|
365
|
-
FilteredIterator.__init__(self, node, post_order_list, filter_func)
|
366
|
-
|
367
|
-
class PrefixedDepthFirstIterator(FilteredIterator):
|
368
|
-
"""a prefixed depth first iterator, designed to be used with visitors
|
369
|
-
"""
|
370
|
-
def __init__(self, node, filter_func=None):
|
371
|
-
FilteredIterator.__init__(self, node, pre_order_list, filter_func)
|
372
|
-
|
@@ -1,161 +0,0 @@
|
|
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
|
-
"""Unicode email support (extends email from stdlib).
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
"""
|
24
|
-
__docformat__ = "restructuredtext en"
|
25
|
-
|
26
|
-
import email
|
27
|
-
from encodings import search_function
|
28
|
-
from email.Utils import parseaddr, parsedate
|
29
|
-
from email.Header import decode_header
|
30
|
-
from datetime import datetime
|
31
|
-
|
32
|
-
try:
|
33
|
-
from mx.DateTime import DateTime
|
34
|
-
except ImportError:
|
35
|
-
DateTime = datetime
|
36
|
-
|
37
|
-
import logilab.common as lgc
|
38
|
-
|
39
|
-
|
40
|
-
def decode_QP(string):
|
41
|
-
parts = []
|
42
|
-
for decoded, charset in decode_header(string):
|
43
|
-
if not charset :
|
44
|
-
charset = 'iso-8859-15'
|
45
|
-
parts.append(unicode(decoded, charset, 'replace'))
|
46
|
-
|
47
|
-
return u' '.join(parts)
|
48
|
-
|
49
|
-
def message_from_file(fd):
|
50
|
-
try:
|
51
|
-
return UMessage(email.message_from_file(fd))
|
52
|
-
except email.Errors.MessageParseError:
|
53
|
-
return ''
|
54
|
-
|
55
|
-
def message_from_string(string):
|
56
|
-
try:
|
57
|
-
return UMessage(email.message_from_string(string))
|
58
|
-
except email.Errors.MessageParseError:
|
59
|
-
return ''
|
60
|
-
|
61
|
-
class UMessage:
|
62
|
-
"""Encapsulates an email.Message instance and returns only unicode objects.
|
63
|
-
"""
|
64
|
-
|
65
|
-
def __init__(self, message):
|
66
|
-
self.message = message
|
67
|
-
|
68
|
-
# email.Message interface #################################################
|
69
|
-
|
70
|
-
def get(self, header, default=None):
|
71
|
-
value = self.message.get(header, default)
|
72
|
-
if value:
|
73
|
-
return decode_QP(value)
|
74
|
-
return value
|
75
|
-
|
76
|
-
def get_all(self, header, default=()):
|
77
|
-
return [decode_QP(val) for val in self.message.get_all(header, default)
|
78
|
-
if val is not None]
|
79
|
-
|
80
|
-
def get_payload(self, index=None, decode=False):
|
81
|
-
message = self.message
|
82
|
-
if index is None:
|
83
|
-
payload = message.get_payload(index, decode)
|
84
|
-
if isinstance(payload, list):
|
85
|
-
return [UMessage(msg) for msg in payload]
|
86
|
-
if message.get_content_maintype() != 'text':
|
87
|
-
return payload
|
88
|
-
|
89
|
-
charset = message.get_content_charset() or 'iso-8859-1'
|
90
|
-
if search_function(charset) is None:
|
91
|
-
charset = 'iso-8859-1'
|
92
|
-
return unicode(payload or '', charset, "replace")
|
93
|
-
else:
|
94
|
-
payload = UMessage(message.get_payload(index, decode))
|
95
|
-
return payload
|
96
|
-
|
97
|
-
def is_multipart(self):
|
98
|
-
return self.message.is_multipart()
|
99
|
-
|
100
|
-
def get_boundary(self):
|
101
|
-
return self.message.get_boundary()
|
102
|
-
|
103
|
-
def walk(self):
|
104
|
-
for part in self.message.walk():
|
105
|
-
yield UMessage(part)
|
106
|
-
|
107
|
-
def get_content_maintype(self):
|
108
|
-
return unicode(self.message.get_content_maintype())
|
109
|
-
|
110
|
-
def get_content_type(self):
|
111
|
-
return unicode(self.message.get_content_type())
|
112
|
-
|
113
|
-
def get_filename(self, failobj=None):
|
114
|
-
value = self.message.get_filename(failobj)
|
115
|
-
if value is failobj:
|
116
|
-
return value
|
117
|
-
try:
|
118
|
-
return unicode(value)
|
119
|
-
except UnicodeDecodeError:
|
120
|
-
return u'error decoding filename'
|
121
|
-
|
122
|
-
# other convenience methods ###############################################
|
123
|
-
|
124
|
-
def headers(self):
|
125
|
-
"""return an unicode string containing all the message's headers"""
|
126
|
-
values = []
|
127
|
-
for header in self.message.keys():
|
128
|
-
values.append(u'%s: %s' % (header, self.get(header)))
|
129
|
-
return '\n'.join(values)
|
130
|
-
|
131
|
-
def multi_addrs(self, header):
|
132
|
-
"""return a list of 2-uple (name, address) for the given address (which
|
133
|
-
is expected to be an header containing address such as from, to, cc...)
|
134
|
-
"""
|
135
|
-
persons = []
|
136
|
-
for person in self.get_all(header, ()):
|
137
|
-
name, mail = parseaddr(person)
|
138
|
-
persons.append((name, mail))
|
139
|
-
return persons
|
140
|
-
|
141
|
-
def date(self, alternative_source=False, return_str=False):
|
142
|
-
"""return a datetime object for the email's date or None if no date is
|
143
|
-
set or if it can't be parsed
|
144
|
-
"""
|
145
|
-
value = self.get('date')
|
146
|
-
if value is None and alternative_source:
|
147
|
-
unix_from = self.message.get_unixfrom()
|
148
|
-
if unix_from is not None:
|
149
|
-
try:
|
150
|
-
value = unix_from.split(" ", 2)[2]
|
151
|
-
except IndexError:
|
152
|
-
pass
|
153
|
-
if value is not None:
|
154
|
-
datetuple = parsedate(value)
|
155
|
-
if datetuple:
|
156
|
-
if lgc.USE_MX_DATETIME:
|
157
|
-
return DateTime(*datetuple[:6])
|
158
|
-
return datetime(*datetuple[:6])
|
159
|
-
elif not return_str:
|
160
|
-
return None
|
161
|
-
return value
|
@@ -1,174 +0,0 @@
|
|
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
|
-
"""Universal report objects and some formatting drivers.
|
19
|
-
|
20
|
-
A way to create simple reports using python objects, primarily designed to be
|
21
|
-
formatted as text and html.
|
22
|
-
"""
|
23
|
-
from __future__ import generators
|
24
|
-
__docformat__ = "restructuredtext en"
|
25
|
-
|
26
|
-
import sys
|
27
|
-
from cStringIO import StringIO
|
28
|
-
from StringIO import StringIO as UStringIO
|
29
|
-
|
30
|
-
from logilab.common.textutils import linesep
|
31
|
-
|
32
|
-
|
33
|
-
def get_nodes(node, klass):
|
34
|
-
"""return an iterator on all children node of the given klass"""
|
35
|
-
for child in node.children:
|
36
|
-
if isinstance(child, klass):
|
37
|
-
yield child
|
38
|
-
# recurse (FIXME: recursion controled by an option)
|
39
|
-
for grandchild in get_nodes(child, klass):
|
40
|
-
yield grandchild
|
41
|
-
|
42
|
-
def layout_title(layout):
|
43
|
-
"""try to return the layout's title as string, return None if not found
|
44
|
-
"""
|
45
|
-
for child in layout.children:
|
46
|
-
if isinstance(child, Title):
|
47
|
-
return ' '.join([node.data for node in get_nodes(child, Text)])
|
48
|
-
|
49
|
-
def build_summary(layout, level=1):
|
50
|
-
"""make a summary for the report, including X level"""
|
51
|
-
assert level > 0
|
52
|
-
level -= 1
|
53
|
-
summary = List(klass='summary')
|
54
|
-
for child in layout.children:
|
55
|
-
if not isinstance(child, Section):
|
56
|
-
continue
|
57
|
-
label = layout_title(child)
|
58
|
-
if not label and not child.id:
|
59
|
-
continue
|
60
|
-
if not child.id:
|
61
|
-
child.id = label.replace(' ', '-')
|
62
|
-
node = Link('#'+child.id, label=label or child.id)
|
63
|
-
# FIXME: Three following lines produce not very compliant
|
64
|
-
# docbook: there are some useless <para><para>. They might be
|
65
|
-
# replaced by the three commented lines but this then produces
|
66
|
-
# a bug in html display...
|
67
|
-
if level and [n for n in child.children if isinstance(n, Section)]:
|
68
|
-
node = Paragraph([node, build_summary(child, level)])
|
69
|
-
summary.append(node)
|
70
|
-
# summary.append(node)
|
71
|
-
# if level and [n for n in child.children if isinstance(n, Section)]:
|
72
|
-
# summary.append(build_summary(child, level))
|
73
|
-
return summary
|
74
|
-
|
75
|
-
|
76
|
-
class BaseWriter(object):
|
77
|
-
"""base class for ureport writers"""
|
78
|
-
|
79
|
-
def format(self, layout, stream=None, encoding=None):
|
80
|
-
"""format and write the given layout into the stream object
|
81
|
-
|
82
|
-
unicode policy: unicode strings may be found in the layout;
|
83
|
-
try to call stream.write with it, but give it back encoded using
|
84
|
-
the given encoding if it fails
|
85
|
-
"""
|
86
|
-
if stream is None:
|
87
|
-
stream = sys.stdout
|
88
|
-
if not encoding:
|
89
|
-
encoding = getattr(stream, 'encoding', 'UTF-8')
|
90
|
-
self.encoding = encoding or 'UTF-8'
|
91
|
-
self.__compute_funcs = []
|
92
|
-
self.out = stream
|
93
|
-
self.begin_format(layout)
|
94
|
-
layout.accept(self)
|
95
|
-
self.end_format(layout)
|
96
|
-
|
97
|
-
def format_children(self, layout):
|
98
|
-
"""recurse on the layout children and call their accept method
|
99
|
-
(see the Visitor pattern)
|
100
|
-
"""
|
101
|
-
for child in getattr(layout, 'children', ()):
|
102
|
-
child.accept(self)
|
103
|
-
|
104
|
-
def writeln(self, string=''):
|
105
|
-
"""write a line in the output buffer"""
|
106
|
-
self.write(string + linesep)
|
107
|
-
|
108
|
-
def write(self, string):
|
109
|
-
"""write a string in the output buffer"""
|
110
|
-
try:
|
111
|
-
self.out.write(string)
|
112
|
-
except UnicodeEncodeError:
|
113
|
-
self.out.write(string.encode(self.encoding))
|
114
|
-
|
115
|
-
def begin_format(self, layout):
|
116
|
-
"""begin to format a layout"""
|
117
|
-
self.section = 0
|
118
|
-
|
119
|
-
def end_format(self, layout):
|
120
|
-
"""finished to format a layout"""
|
121
|
-
|
122
|
-
def get_table_content(self, table):
|
123
|
-
"""trick to get table content without actually writing it
|
124
|
-
|
125
|
-
return an aligned list of lists containing table cells values as string
|
126
|
-
"""
|
127
|
-
result = [[]]
|
128
|
-
cols = table.cols
|
129
|
-
for cell in self.compute_content(table):
|
130
|
-
if cols == 0:
|
131
|
-
result.append([])
|
132
|
-
cols = table.cols
|
133
|
-
cols -= 1
|
134
|
-
result[-1].append(cell)
|
135
|
-
# fill missing cells
|
136
|
-
while len(result[-1]) < cols:
|
137
|
-
result[-1].append('')
|
138
|
-
return result
|
139
|
-
|
140
|
-
def compute_content(self, layout):
|
141
|
-
"""trick to compute the formatting of children layout before actually
|
142
|
-
writing it
|
143
|
-
|
144
|
-
return an iterator on strings (one for each child element)
|
145
|
-
"""
|
146
|
-
# use cells !
|
147
|
-
def write(data):
|
148
|
-
try:
|
149
|
-
stream.write(data)
|
150
|
-
except UnicodeEncodeError:
|
151
|
-
stream.write(data.encode(self.encoding))
|
152
|
-
def writeln(data=''):
|
153
|
-
try:
|
154
|
-
stream.write(data+linesep)
|
155
|
-
except UnicodeEncodeError:
|
156
|
-
stream.write(data.encode(self.encoding)+linesep)
|
157
|
-
self.write = write
|
158
|
-
self.writeln = writeln
|
159
|
-
self.__compute_funcs.append((write, writeln))
|
160
|
-
for child in layout.children:
|
161
|
-
stream = UStringIO()
|
162
|
-
child.accept(self)
|
163
|
-
yield stream.getvalue()
|
164
|
-
self.__compute_funcs.pop()
|
165
|
-
try:
|
166
|
-
self.write, self.writeln = self.__compute_funcs[-1]
|
167
|
-
except IndexError:
|
168
|
-
del self.write
|
169
|
-
del self.writeln
|
170
|
-
|
171
|
-
|
172
|
-
from logilab.common.ureports.nodes import *
|
173
|
-
from logilab.common.ureports.text_writer import TextWriter
|
174
|
-
from logilab.common.ureports.html_writer import HTMLWriter
|