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,383 @@
|
|
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
|
+
"""Add an abstraction level to transparently import optik classes from optparse
|
19
|
+
(python >= 2.3) or the optik package.
|
20
|
+
|
21
|
+
It also defines three new types for optik/optparse command line parser :
|
22
|
+
|
23
|
+
* regexp
|
24
|
+
argument of this type will be converted using re.compile
|
25
|
+
* csv
|
26
|
+
argument of this type will be converted using split(',')
|
27
|
+
* yn
|
28
|
+
argument of this type will be true if 'y' or 'yes', false if 'n' or 'no'
|
29
|
+
* named
|
30
|
+
argument of this type are in the form <NAME>=<VALUE> or <NAME>:<VALUE>
|
31
|
+
* password
|
32
|
+
argument of this type wont be converted but this is used by other tools
|
33
|
+
such as interactive prompt for configuration to double check value and
|
34
|
+
use an invisible field
|
35
|
+
* multiple_choice
|
36
|
+
same as default "choice" type but multiple choices allowed
|
37
|
+
* file
|
38
|
+
argument of this type wont be converted but checked that the given file exists
|
39
|
+
* color
|
40
|
+
argument of this type wont be converted but checked its either a
|
41
|
+
named color or a color specified using hexadecimal notation (preceded by a #)
|
42
|
+
* time
|
43
|
+
argument of this type will be converted to a float value in seconds
|
44
|
+
according to time units (ms, s, min, h, d)
|
45
|
+
* bytes
|
46
|
+
argument of this type will be converted to a float value in bytes
|
47
|
+
according to byte units (b, kb, mb, gb, tb)
|
48
|
+
"""
|
49
|
+
__docformat__ = "restructuredtext en"
|
50
|
+
|
51
|
+
import re
|
52
|
+
import sys
|
53
|
+
import time
|
54
|
+
from copy import copy
|
55
|
+
from os.path import exists
|
56
|
+
|
57
|
+
# python >= 2.3
|
58
|
+
from optparse import OptionParser as BaseParser, Option as BaseOption, \
|
59
|
+
OptionGroup, OptionContainer, OptionValueError, OptionError, \
|
60
|
+
Values, HelpFormatter, NO_DEFAULT, SUPPRESS_HELP
|
61
|
+
|
62
|
+
try:
|
63
|
+
from mx import DateTime
|
64
|
+
HAS_MX_DATETIME = True
|
65
|
+
except ImportError:
|
66
|
+
HAS_MX_DATETIME = False
|
67
|
+
|
68
|
+
|
69
|
+
OPTPARSE_FORMAT_DEFAULT = sys.version_info >= (2, 4)
|
70
|
+
|
71
|
+
from logilab.common.textutils import splitstrip
|
72
|
+
|
73
|
+
def check_regexp(option, opt, value):
|
74
|
+
"""check a regexp value by trying to compile it
|
75
|
+
return the compiled regexp
|
76
|
+
"""
|
77
|
+
if hasattr(value, 'pattern'):
|
78
|
+
return value
|
79
|
+
try:
|
80
|
+
return re.compile(value)
|
81
|
+
except ValueError:
|
82
|
+
raise OptionValueError(
|
83
|
+
"option %s: invalid regexp value: %r" % (opt, value))
|
84
|
+
|
85
|
+
def check_csv(option, opt, value):
|
86
|
+
"""check a csv value by trying to split it
|
87
|
+
return the list of separated values
|
88
|
+
"""
|
89
|
+
if isinstance(value, (list, tuple)):
|
90
|
+
return value
|
91
|
+
try:
|
92
|
+
return splitstrip(value)
|
93
|
+
except ValueError:
|
94
|
+
raise OptionValueError(
|
95
|
+
"option %s: invalid csv value: %r" % (opt, value))
|
96
|
+
|
97
|
+
def check_yn(option, opt, value):
|
98
|
+
"""check a yn value
|
99
|
+
return true for yes and false for no
|
100
|
+
"""
|
101
|
+
if isinstance(value, int):
|
102
|
+
return bool(value)
|
103
|
+
if value in ('y', 'yes'):
|
104
|
+
return True
|
105
|
+
if value in ('n', 'no'):
|
106
|
+
return False
|
107
|
+
msg = "option %s: invalid yn value %r, should be in (y, yes, n, no)"
|
108
|
+
raise OptionValueError(msg % (opt, value))
|
109
|
+
|
110
|
+
def check_named(option, opt, value):
|
111
|
+
"""check a named value
|
112
|
+
return a dictionary containing (name, value) associations
|
113
|
+
"""
|
114
|
+
if isinstance(value, dict):
|
115
|
+
return value
|
116
|
+
values = []
|
117
|
+
for value in check_csv(option, opt, value):
|
118
|
+
if value.find('=') != -1:
|
119
|
+
values.append(value.split('=', 1))
|
120
|
+
elif value.find(':') != -1:
|
121
|
+
values.append(value.split(':', 1))
|
122
|
+
if values:
|
123
|
+
return dict(values)
|
124
|
+
msg = "option %s: invalid named value %r, should be <NAME>=<VALUE> or \
|
125
|
+
<NAME>:<VALUE>"
|
126
|
+
raise OptionValueError(msg % (opt, value))
|
127
|
+
|
128
|
+
def check_password(option, opt, value):
|
129
|
+
"""check a password value (can't be empty)
|
130
|
+
"""
|
131
|
+
# no actual checking, monkey patch if you want more
|
132
|
+
return value
|
133
|
+
|
134
|
+
def check_file(option, opt, value):
|
135
|
+
"""check a file value
|
136
|
+
return the filepath
|
137
|
+
"""
|
138
|
+
if exists(value):
|
139
|
+
return value
|
140
|
+
msg = "option %s: file %r does not exist"
|
141
|
+
raise OptionValueError(msg % (opt, value))
|
142
|
+
|
143
|
+
# XXX use python datetime
|
144
|
+
def check_date(option, opt, value):
|
145
|
+
"""check a file value
|
146
|
+
return the filepath
|
147
|
+
"""
|
148
|
+
try:
|
149
|
+
return DateTime.strptime(value, "%Y/%m/%d")
|
150
|
+
except DateTime.Error :
|
151
|
+
raise OptionValueError(
|
152
|
+
"expected format of %s is yyyy/mm/dd" % opt)
|
153
|
+
|
154
|
+
def check_color(option, opt, value):
|
155
|
+
"""check a color value and returns it
|
156
|
+
/!\ does *not* check color labels (like 'red', 'green'), only
|
157
|
+
checks hexadecimal forms
|
158
|
+
"""
|
159
|
+
# Case (1) : color label, we trust the end-user
|
160
|
+
if re.match('[a-z0-9 ]+$', value, re.I):
|
161
|
+
return value
|
162
|
+
# Case (2) : only accepts hexadecimal forms
|
163
|
+
if re.match('#[a-f0-9]{6}', value, re.I):
|
164
|
+
return value
|
165
|
+
# Else : not a color label neither a valid hexadecimal form => error
|
166
|
+
msg = "option %s: invalid color : %r, should be either hexadecimal \
|
167
|
+
value or predefined color"
|
168
|
+
raise OptionValueError(msg % (opt, value))
|
169
|
+
|
170
|
+
def check_time(option, opt, value):
|
171
|
+
from logilab.common.textutils import TIME_UNITS, apply_units
|
172
|
+
if isinstance(value, (int, long, float)):
|
173
|
+
return value
|
174
|
+
return apply_units(value, TIME_UNITS)
|
175
|
+
|
176
|
+
def check_bytes(option, opt, value):
|
177
|
+
from logilab.common.textutils import BYTE_UNITS, apply_units
|
178
|
+
if hasattr(value, '__int__'):
|
179
|
+
return value
|
180
|
+
return apply_units(value, BYTE_UNITS)
|
181
|
+
|
182
|
+
import types
|
183
|
+
|
184
|
+
class Option(BaseOption):
|
185
|
+
"""override optik.Option to add some new option types
|
186
|
+
"""
|
187
|
+
TYPES = BaseOption.TYPES + ('regexp', 'csv', 'yn', 'named', 'password',
|
188
|
+
'multiple_choice', 'file', 'color',
|
189
|
+
'time', 'bytes')
|
190
|
+
ATTRS = BaseOption.ATTRS + ['hide', 'level']
|
191
|
+
TYPE_CHECKER = copy(BaseOption.TYPE_CHECKER)
|
192
|
+
TYPE_CHECKER['regexp'] = check_regexp
|
193
|
+
TYPE_CHECKER['csv'] = check_csv
|
194
|
+
TYPE_CHECKER['yn'] = check_yn
|
195
|
+
TYPE_CHECKER['named'] = check_named
|
196
|
+
TYPE_CHECKER['multiple_choice'] = check_csv
|
197
|
+
TYPE_CHECKER['file'] = check_file
|
198
|
+
TYPE_CHECKER['color'] = check_color
|
199
|
+
TYPE_CHECKER['password'] = check_password
|
200
|
+
TYPE_CHECKER['time'] = check_time
|
201
|
+
TYPE_CHECKER['bytes'] = check_bytes
|
202
|
+
if HAS_MX_DATETIME:
|
203
|
+
TYPES += ('date',)
|
204
|
+
TYPE_CHECKER['date'] = check_date
|
205
|
+
|
206
|
+
def __init__(self, *opts, **attrs):
|
207
|
+
BaseOption.__init__(self, *opts, **attrs)
|
208
|
+
if hasattr(self, "hide") and self.hide:
|
209
|
+
self.help = SUPPRESS_HELP
|
210
|
+
|
211
|
+
def _check_choice(self):
|
212
|
+
"""FIXME: need to override this due to optik misdesign"""
|
213
|
+
if self.type in ("choice", "multiple_choice"):
|
214
|
+
if self.choices is None:
|
215
|
+
raise OptionError(
|
216
|
+
"must supply a list of choices for type 'choice'", self)
|
217
|
+
elif type(self.choices) not in (types.TupleType, types.ListType):
|
218
|
+
raise OptionError(
|
219
|
+
"choices must be a list of strings ('%s' supplied)"
|
220
|
+
% str(type(self.choices)).split("'")[1], self)
|
221
|
+
elif self.choices is not None:
|
222
|
+
raise OptionError(
|
223
|
+
"must not supply choices for type %r" % self.type, self)
|
224
|
+
BaseOption.CHECK_METHODS[2] = _check_choice
|
225
|
+
|
226
|
+
|
227
|
+
def process(self, opt, value, values, parser):
|
228
|
+
# First, convert the value(s) to the right type. Howl if any
|
229
|
+
# value(s) are bogus.
|
230
|
+
try:
|
231
|
+
value = self.convert_value(opt, value)
|
232
|
+
except AttributeError: # py < 2.4
|
233
|
+
value = self.check_value(opt, value)
|
234
|
+
if self.type == 'named':
|
235
|
+
existant = getattr(values, self.dest)
|
236
|
+
if existant:
|
237
|
+
existant.update(value)
|
238
|
+
value = existant
|
239
|
+
# And then take whatever action is expected of us.
|
240
|
+
# This is a separate method to make life easier for
|
241
|
+
# subclasses to add new actions.
|
242
|
+
return self.take_action(
|
243
|
+
self.action, self.dest, opt, value, values, parser)
|
244
|
+
|
245
|
+
class OptionParser(BaseParser):
|
246
|
+
"""override optik.OptionParser to use our Option class
|
247
|
+
"""
|
248
|
+
def __init__(self, option_class=Option, *args, **kwargs):
|
249
|
+
BaseParser.__init__(self, option_class=Option, *args, **kwargs)
|
250
|
+
|
251
|
+
def format_option_help(self, formatter=None):
|
252
|
+
if formatter is None:
|
253
|
+
formatter = self.formatter
|
254
|
+
outputlevel = getattr(formatter, 'output_level', 0)
|
255
|
+
formatter.store_option_strings(self)
|
256
|
+
result = []
|
257
|
+
result.append(formatter.format_heading("Options"))
|
258
|
+
formatter.indent()
|
259
|
+
if self.option_list:
|
260
|
+
result.append(OptionContainer.format_option_help(self, formatter))
|
261
|
+
result.append("\n")
|
262
|
+
for group in self.option_groups:
|
263
|
+
if group.level <= outputlevel:
|
264
|
+
result.append(group.format_help(formatter))
|
265
|
+
result.append("\n")
|
266
|
+
formatter.dedent()
|
267
|
+
# Drop the last "\n", or the header if no options or option groups:
|
268
|
+
return "".join(result[:-1])
|
269
|
+
|
270
|
+
|
271
|
+
OptionGroup.level = 0
|
272
|
+
|
273
|
+
def format_option_help(self, formatter):
|
274
|
+
result = []
|
275
|
+
outputlevel = getattr(formatter, 'output_level', 0)
|
276
|
+
for option in self.option_list:
|
277
|
+
if getattr(option, 'level', 0) <= outputlevel and not option.help is SUPPRESS_HELP:
|
278
|
+
result.append(formatter.format_option(option))
|
279
|
+
return "".join(result)
|
280
|
+
OptionContainer.format_option_help = format_option_help
|
281
|
+
OptionContainer.format_option_help = format_option_help
|
282
|
+
|
283
|
+
class ManHelpFormatter(HelpFormatter):
|
284
|
+
"""Format help using man pages ROFF format"""
|
285
|
+
|
286
|
+
def __init__ (self,
|
287
|
+
indent_increment=0,
|
288
|
+
max_help_position=24,
|
289
|
+
width=79,
|
290
|
+
short_first=0):
|
291
|
+
HelpFormatter.__init__ (
|
292
|
+
self, indent_increment, max_help_position, width, short_first)
|
293
|
+
|
294
|
+
def format_heading(self, heading):
|
295
|
+
return '.SH %s\n' % heading.upper()
|
296
|
+
|
297
|
+
def format_description(self, description):
|
298
|
+
return description
|
299
|
+
|
300
|
+
def format_option(self, option):
|
301
|
+
try:
|
302
|
+
optstring = option.option_strings
|
303
|
+
except AttributeError:
|
304
|
+
optstring = self.format_option_strings(option)
|
305
|
+
if option.help:
|
306
|
+
help_text = self.expand_default(option)
|
307
|
+
help = ' '.join([l.strip() for l in help_text.splitlines()])
|
308
|
+
else:
|
309
|
+
help = ''
|
310
|
+
return '''.IP "%s"
|
311
|
+
%s
|
312
|
+
''' % (optstring, help)
|
313
|
+
|
314
|
+
def format_head(self, optparser, pkginfo, section=1):
|
315
|
+
try:
|
316
|
+
pgm = optparser._get_prog_name()
|
317
|
+
except AttributeError:
|
318
|
+
# py >= 2.4.X (dunno which X exactly, at least 2)
|
319
|
+
pgm = optparser.get_prog_name()
|
320
|
+
short_desc = self.format_short_description(pgm, pkginfo.description)
|
321
|
+
return '%s\n%s\n%s' % (self.format_title(pgm, section), short_desc,
|
322
|
+
self.format_synopsis(pgm))
|
323
|
+
|
324
|
+
def format_title(self, pgm, section):
|
325
|
+
date = '-'.join([str(num) for num in time.localtime()[:3]])
|
326
|
+
return '.TH %s %s "%s" %s' % (pgm, section, date, pgm)
|
327
|
+
|
328
|
+
def format_short_description(self, pgm, short_desc):
|
329
|
+
return '''.SH NAME
|
330
|
+
.B %s
|
331
|
+
\- %s
|
332
|
+
''' % (pgm, short_desc.strip())
|
333
|
+
|
334
|
+
def format_synopsis(self, pgm):
|
335
|
+
return '''.SH SYNOPSIS
|
336
|
+
.B %s
|
337
|
+
[
|
338
|
+
.I OPTIONS
|
339
|
+
] [
|
340
|
+
.I <arguments>
|
341
|
+
]
|
342
|
+
''' % pgm
|
343
|
+
|
344
|
+
def format_long_description(self, pgm, long_desc):
|
345
|
+
long_desc = '\n'.join([line.lstrip()
|
346
|
+
for line in long_desc.splitlines()])
|
347
|
+
long_desc = long_desc.replace('\n.\n', '\n\n')
|
348
|
+
if long_desc.lower().startswith(pgm):
|
349
|
+
long_desc = long_desc[len(pgm):]
|
350
|
+
return '''.SH DESCRIPTION
|
351
|
+
.B %s
|
352
|
+
%s
|
353
|
+
''' % (pgm, long_desc.strip())
|
354
|
+
|
355
|
+
def format_tail(self, pkginfo):
|
356
|
+
return '''.SH SEE ALSO
|
357
|
+
/usr/share/doc/pythonX.Y-%s/
|
358
|
+
|
359
|
+
.SH COPYRIGHT
|
360
|
+
%s
|
361
|
+
|
362
|
+
.SH BUGS
|
363
|
+
Please report bugs on the project\'s mailing list:
|
364
|
+
%s
|
365
|
+
|
366
|
+
.SH AUTHOR
|
367
|
+
%s <%s>
|
368
|
+
''' % (getattr(pkginfo, 'debian_name', pkginfo.modname), pkginfo.copyright,
|
369
|
+
pkginfo.mailinglist, pkginfo.author, pkginfo.author_email)
|
370
|
+
|
371
|
+
|
372
|
+
def generate_manpage(optparser, pkginfo, section=1, stream=sys.stdout, level=0):
|
373
|
+
"""generate a man page from an optik parser"""
|
374
|
+
formatter = ManHelpFormatter()
|
375
|
+
formatter.output_level = level
|
376
|
+
formatter.parser = optparser
|
377
|
+
print >> stream, formatter.format_head(optparser, pkginfo, section)
|
378
|
+
print >> stream, optparser.format_option_help(formatter)
|
379
|
+
print >> stream, formatter.format_tail(pkginfo)
|
380
|
+
|
381
|
+
|
382
|
+
__all__ = ('OptionParser', 'Option', 'OptionGroup', 'OptionValueError',
|
383
|
+
'Values')
|
@@ -0,0 +1,92 @@
|
|
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
|
+
"""Extend OptionParser with commands.
|
20
|
+
|
21
|
+
Example:
|
22
|
+
|
23
|
+
>>> parser = OptionParser()
|
24
|
+
>>> parser.usage = '%prog COMMAND [options] <arg> ...'
|
25
|
+
>>> parser.add_command('build', 'mymod.build')
|
26
|
+
>>> parser.add_command('clean', run_clean, add_opt_clean)
|
27
|
+
>>> run, options, args = parser.parse_command(sys.argv[1:])
|
28
|
+
>>> return run(options, args[1:])
|
29
|
+
|
30
|
+
With mymod.build that defines two functions run and add_options
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
"""
|
36
|
+
__docformat__ = "restructuredtext en"
|
37
|
+
|
38
|
+
# XXX merge with optik_ext ? merge with clcommands ?
|
39
|
+
|
40
|
+
import sys
|
41
|
+
import optparse
|
42
|
+
|
43
|
+
class OptionParser(optparse.OptionParser):
|
44
|
+
|
45
|
+
def __init__(self, *args, **kwargs):
|
46
|
+
optparse.OptionParser.__init__(self, *args, **kwargs)
|
47
|
+
self._commands = {}
|
48
|
+
self.min_args, self.max_args = 0, 1
|
49
|
+
|
50
|
+
def add_command(self, name, mod_or_funcs, help=''):
|
51
|
+
"""name of the command
|
52
|
+
name of module or tuple of functions (run, add_options)
|
53
|
+
"""
|
54
|
+
assert isinstance(mod_or_funcs, str) or isinstance(mod_or_funcs, tuple), \
|
55
|
+
"mod_or_funcs has to be a module name or a tuple of functions"
|
56
|
+
self._commands[name] = (mod_or_funcs, help)
|
57
|
+
|
58
|
+
def print_main_help(self):
|
59
|
+
optparse.OptionParser.print_help(self)
|
60
|
+
print '\ncommands:'
|
61
|
+
for cmdname, (_, help) in self._commands.items():
|
62
|
+
print '% 10s - %s' % (cmdname, help)
|
63
|
+
|
64
|
+
def parse_command(self, args):
|
65
|
+
if len(args) == 0:
|
66
|
+
self.print_main_help()
|
67
|
+
sys.exit(1)
|
68
|
+
cmd = args[0]
|
69
|
+
args = args[1:]
|
70
|
+
if cmd not in self._commands:
|
71
|
+
if cmd in ('-h', '--help'):
|
72
|
+
self.print_main_help()
|
73
|
+
sys.exit(0)
|
74
|
+
elif self.version is not None and cmd == "--version":
|
75
|
+
self.print_version()
|
76
|
+
sys.exit(0)
|
77
|
+
self.error('unknown command')
|
78
|
+
self.prog = '%s %s' % (self.prog, cmd)
|
79
|
+
mod_or_f, help = self._commands[cmd]
|
80
|
+
# optparse inserts self.description between usage and options help
|
81
|
+
self.description = help
|
82
|
+
if isinstance(mod_or_f, str):
|
83
|
+
exec 'from %s import run, add_options' % mod_or_f
|
84
|
+
else:
|
85
|
+
run, add_options = mod_or_f
|
86
|
+
add_options(self)
|
87
|
+
(options, args) = self.parse_args(args)
|
88
|
+
if not (self.min_args <= len(args) <= self.max_args):
|
89
|
+
self.error('incorrect number of arguments')
|
90
|
+
return run, options, args
|
91
|
+
|
92
|
+
|
@@ -0,0 +1,111 @@
|
|
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
|
+
"""Manipulate pdf and fdf files (pdftk recommended).
|
19
|
+
|
20
|
+
Notes regarding pdftk, pdf forms and fdf files (form definition file)
|
21
|
+
fields names can be extracted with:
|
22
|
+
|
23
|
+
pdftk orig.pdf generate_fdf output truc.fdf
|
24
|
+
|
25
|
+
to merge fdf and pdf:
|
26
|
+
|
27
|
+
pdftk orig.pdf fill_form test.fdf output result.pdf [flatten]
|
28
|
+
|
29
|
+
without flatten, one could further edit the resulting form.
|
30
|
+
with flatten, everything is turned into text.
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
"""
|
36
|
+
__docformat__ = "restructuredtext en"
|
37
|
+
# XXX seems very unix specific
|
38
|
+
# TODO: check availability of pdftk at import
|
39
|
+
|
40
|
+
|
41
|
+
import os
|
42
|
+
|
43
|
+
HEAD="""%FDF-1.2
|
44
|
+
%\xE2\xE3\xCF\xD3
|
45
|
+
1 0 obj
|
46
|
+
<<
|
47
|
+
/FDF
|
48
|
+
<<
|
49
|
+
/Fields [
|
50
|
+
"""
|
51
|
+
|
52
|
+
TAIL="""]
|
53
|
+
>>
|
54
|
+
>>
|
55
|
+
endobj
|
56
|
+
trailer
|
57
|
+
|
58
|
+
<<
|
59
|
+
/Root 1 0 R
|
60
|
+
>>
|
61
|
+
%%EOF
|
62
|
+
"""
|
63
|
+
|
64
|
+
def output_field( f ):
|
65
|
+
return "\xfe\xff" + "".join( [ "\x00"+c for c in f ] )
|
66
|
+
|
67
|
+
def extract_keys(lines):
|
68
|
+
keys = []
|
69
|
+
for line in lines:
|
70
|
+
if line.startswith('/V'):
|
71
|
+
pass #print 'value',line
|
72
|
+
elif line.startswith('/T'):
|
73
|
+
key = line[7:-2]
|
74
|
+
key = ''.join(key.split('\x00'))
|
75
|
+
keys.append( key )
|
76
|
+
return keys
|
77
|
+
|
78
|
+
def write_field(out, key, value):
|
79
|
+
out.write("<<\n")
|
80
|
+
if value:
|
81
|
+
out.write("/V (%s)\n" %value)
|
82
|
+
else:
|
83
|
+
out.write("/V /\n")
|
84
|
+
out.write("/T (%s)\n" % output_field(key) )
|
85
|
+
out.write(">> \n")
|
86
|
+
|
87
|
+
def write_fields(out, fields):
|
88
|
+
out.write(HEAD)
|
89
|
+
for (key,value,comment) in fields:
|
90
|
+
write_field(out, key, value)
|
91
|
+
write_field(out, key+"a", value) # pour copie-carbone sur autres pages
|
92
|
+
out.write(TAIL)
|
93
|
+
|
94
|
+
def extract_keys_from_pdf(filename):
|
95
|
+
# what about using 'pdftk filename dump_data_fields' and parsing the output ?
|
96
|
+
os.system('pdftk %s generate_fdf output /tmp/toto.fdf' % filename)
|
97
|
+
lines = file('/tmp/toto.fdf').readlines()
|
98
|
+
return extract_keys(lines)
|
99
|
+
|
100
|
+
|
101
|
+
def fill_pdf(infile, outfile, fields):
|
102
|
+
write_fields(file('/tmp/toto.fdf', 'w'), fields)
|
103
|
+
os.system('pdftk %s fill_form /tmp/toto.fdf output %s flatten' % (infile, outfile))
|
104
|
+
|
105
|
+
def testfill_pdf(infile, outfile):
|
106
|
+
keys = extract_keys_from_pdf(infile)
|
107
|
+
fields = []
|
108
|
+
for key in keys:
|
109
|
+
fields.append( (key, key, '') )
|
110
|
+
fill_pdf(infile, outfile, fields)
|
111
|
+
|