forked from mirrors/gecko-dev
		
	This commit is a simple 'hg mv' and does not contain any file modifications. *** Bug 1346025 - Split vendored modules in python/moz.build to third_party/python/moz.build, r=ted *** Bug 1346025 - Update references to moved python modules, r=ted MozReview-Commit-ID: A12RnIFtXju --HG-- rename : python/PyECC/MANIFEST.in => third_party/python/PyECC/MANIFEST.in rename : python/PyECC/README.md => third_party/python/PyECC/README.md rename : python/PyECC/ecc/Key.py => third_party/python/PyECC/ecc/Key.py rename : python/PyECC/ecc/Rabbit.py => third_party/python/PyECC/ecc/Rabbit.py rename : python/PyECC/ecc/SecurityViolationException.py => third_party/python/PyECC/ecc/SecurityViolationException.py rename : python/PyECC/ecc/__init__.py => third_party/python/PyECC/ecc/__init__.py rename : python/PyECC/ecc/curves.py => third_party/python/PyECC/ecc/curves.py rename : python/PyECC/ecc/eccrypt.py => third_party/python/PyECC/ecc/eccrypt.py rename : python/PyECC/ecc/ecdsa.py => third_party/python/PyECC/ecc/ecdsa.py rename : python/PyECC/ecc/elliptic.py => third_party/python/PyECC/ecc/elliptic.py rename : python/PyECC/ecc/encoding.py => third_party/python/PyECC/ecc/encoding.py rename : python/PyECC/ecc/performance.py => third_party/python/PyECC/ecc/performance.py rename : python/PyECC/ecc/primes.py => third_party/python/PyECC/ecc/primes.py rename : python/PyECC/ecc/shacrypt.py => third_party/python/PyECC/ecc/shacrypt.py rename : python/PyECC/setup.py => third_party/python/PyECC/setup.py rename : python/blessings/LICENSE => third_party/python/blessings/LICENSE rename : python/blessings/MANIFEST.in => third_party/python/blessings/MANIFEST.in rename : python/blessings/PKG-INFO => third_party/python/blessings/PKG-INFO rename : python/blessings/README.rst => third_party/python/blessings/README.rst rename : python/blessings/blessings/__init__.py => third_party/python/blessings/blessings/__init__.py rename : python/blessings/blessings/tests.py => third_party/python/blessings/blessings/tests.py rename : python/blessings/setup.cfg => third_party/python/blessings/setup.cfg rename : python/blessings/setup.py => third_party/python/blessings/setup.py rename : python/blessings/tox.ini => third_party/python/blessings/tox.ini rename : python/compare-locales/compare_locales/__init__.py => third_party/python/compare-locales/compare_locales/__init__.py rename : python/compare-locales/compare_locales/checks.py => third_party/python/compare-locales/compare_locales/checks.py rename : python/compare-locales/compare_locales/commands.py => third_party/python/compare-locales/compare_locales/commands.py rename : python/compare-locales/compare_locales/compare.py => third_party/python/compare-locales/compare_locales/compare.py rename : python/compare-locales/compare_locales/parser.py => third_party/python/compare-locales/compare_locales/parser.py rename : python/compare-locales/compare_locales/paths.py => third_party/python/compare-locales/compare_locales/paths.py rename : python/compare-locales/compare_locales/tests/__init__.py => third_party/python/compare-locales/compare_locales/tests/__init__.py rename : python/compare-locales/compare_locales/tests/data/bug121341.properties => third_party/python/compare-locales/compare_locales/tests/data/bug121341.properties rename : python/compare-locales/compare_locales/tests/data/test.properties => third_party/python/compare-locales/compare_locales/tests/data/test.properties rename : python/compare-locales/compare_locales/tests/data/triple-license.dtd => third_party/python/compare-locales/compare_locales/tests/data/triple-license.dtd rename : python/compare-locales/compare_locales/tests/test_checks.py => third_party/python/compare-locales/compare_locales/tests/test_checks.py rename : python/compare-locales/compare_locales/tests/test_compare.py => third_party/python/compare-locales/compare_locales/tests/test_compare.py rename : python/compare-locales/compare_locales/tests/test_dtd.py => third_party/python/compare-locales/compare_locales/tests/test_dtd.py rename : python/compare-locales/compare_locales/tests/test_ini.py => third_party/python/compare-locales/compare_locales/tests/test_ini.py rename : python/compare-locales/compare_locales/tests/test_merge.py => third_party/python/compare-locales/compare_locales/tests/test_merge.py rename : python/compare-locales/compare_locales/tests/test_properties.py => third_party/python/compare-locales/compare_locales/tests/test_properties.py rename : python/compare-locales/compare_locales/tests/test_util.py => third_party/python/compare-locales/compare_locales/tests/test_util.py rename : python/compare-locales/compare_locales/tests/test_webapps.py => third_party/python/compare-locales/compare_locales/tests/test_webapps.py rename : python/compare-locales/compare_locales/util.py => third_party/python/compare-locales/compare_locales/util.py rename : python/compare-locales/compare_locales/webapps.py => third_party/python/compare-locales/compare_locales/webapps.py rename : python/configobj/PKG-INFO => third_party/python/configobj/PKG-INFO rename : python/configobj/configobj.py => third_party/python/configobj/configobj.py rename : python/configobj/setup.py => third_party/python/configobj/setup.py rename : python/configobj/validate.py => third_party/python/configobj/validate.py rename : python/dlmanager/README.rst => third_party/python/dlmanager/README.rst rename : python/dlmanager/check.py => third_party/python/dlmanager/check.py rename : python/dlmanager/dlmanager/__init__.py => third_party/python/dlmanager/dlmanager/__init__.py rename : python/dlmanager/dlmanager/fs.py => third_party/python/dlmanager/dlmanager/fs.py rename : python/dlmanager/dlmanager/manager.py => third_party/python/dlmanager/dlmanager/manager.py rename : python/dlmanager/dlmanager/persist_limit.py => third_party/python/dlmanager/dlmanager/persist_limit.py rename : python/dlmanager/doc/Makefile => third_party/python/dlmanager/doc/Makefile rename : python/dlmanager/doc/api.rst => third_party/python/dlmanager/doc/api.rst rename : python/dlmanager/doc/conf.py => third_party/python/dlmanager/doc/conf.py rename : python/dlmanager/doc/index.rst => third_party/python/dlmanager/doc/index.rst rename : python/dlmanager/doc/make.bat => third_party/python/dlmanager/doc/make.bat rename : python/dlmanager/examples/dl_progressbar.py => third_party/python/dlmanager/examples/dl_progressbar.py rename : python/dlmanager/examples/dl_tqdm.py => third_party/python/dlmanager/examples/dl_tqdm.py rename : python/dlmanager/requirements.txt => third_party/python/dlmanager/requirements.txt rename : python/dlmanager/setup.cfg => third_party/python/dlmanager/setup.cfg rename : python/dlmanager/setup.py => third_party/python/dlmanager/setup.py rename : python/dlmanager/test-requirements.txt => third_party/python/dlmanager/test-requirements.txt rename : python/dlmanager/tests/__init__.py => third_party/python/dlmanager/tests/__init__.py rename : python/dlmanager/tests/test_manager.py => third_party/python/dlmanager/tests/test_manager.py rename : python/dlmanager/tests/test_persist_limit.py => third_party/python/dlmanager/tests/test_persist_limit.py rename : python/futures/CHANGES => third_party/python/futures/CHANGES rename : python/futures/LICENSE => third_party/python/futures/LICENSE rename : python/futures/MANIFEST.in => third_party/python/futures/MANIFEST.in rename : python/futures/PKG-INFO => third_party/python/futures/PKG-INFO rename : python/futures/concurrent/__init__.py => third_party/python/futures/concurrent/__init__.py rename : python/futures/concurrent/futures/__init__.py => third_party/python/futures/concurrent/futures/__init__.py rename : python/futures/concurrent/futures/_base.py => third_party/python/futures/concurrent/futures/_base.py rename : python/futures/concurrent/futures/process.py => third_party/python/futures/concurrent/futures/process.py rename : python/futures/concurrent/futures/thread.py => third_party/python/futures/concurrent/futures/thread.py rename : python/futures/crawl.py => third_party/python/futures/crawl.py rename : python/futures/docs/Makefile => third_party/python/futures/docs/Makefile rename : python/futures/docs/conf.py => third_party/python/futures/docs/conf.py rename : python/futures/docs/index.rst => third_party/python/futures/docs/index.rst rename : python/futures/docs/make.bat => third_party/python/futures/docs/make.bat rename : python/futures/futures.egg-info/PKG-INFO => third_party/python/futures/futures.egg-info/PKG-INFO rename : python/futures/futures.egg-info/SOURCES.txt => third_party/python/futures/futures.egg-info/SOURCES.txt rename : python/futures/futures.egg-info/dependency_links.txt => third_party/python/futures/futures.egg-info/dependency_links.txt rename : python/futures/futures.egg-info/not-zip-safe => third_party/python/futures/futures.egg-info/not-zip-safe rename : python/futures/futures.egg-info/pbr.json => third_party/python/futures/futures.egg-info/pbr.json rename : python/futures/futures.egg-info/top_level.txt => third_party/python/futures/futures.egg-info/top_level.txt rename : python/futures/primes.py => third_party/python/futures/primes.py rename : python/futures/setup.cfg => third_party/python/futures/setup.cfg rename : python/futures/setup.py => third_party/python/futures/setup.py rename : python/futures/test_futures.py => third_party/python/futures/test_futures.py rename : python/futures/tox.ini => third_party/python/futures/tox.ini rename : python/gdbpp/gdbpp/__init__.py => third_party/python/gdbpp/gdbpp/__init__.py rename : python/gdbpp/gdbpp/linkedlist.py => third_party/python/gdbpp/gdbpp/linkedlist.py rename : python/gdbpp/gdbpp/owningthread.py => third_party/python/gdbpp/gdbpp/owningthread.py rename : python/gdbpp/gdbpp/smartptr.py => third_party/python/gdbpp/gdbpp/smartptr.py rename : python/gdbpp/gdbpp/string.py => third_party/python/gdbpp/gdbpp/string.py rename : python/gdbpp/gdbpp/tarray.py => third_party/python/gdbpp/gdbpp/tarray.py rename : python/gdbpp/gdbpp/thashtable.py => third_party/python/gdbpp/gdbpp/thashtable.py rename : python/jsmin/jsmin/__init__.py => third_party/python/jsmin/jsmin/__init__.py rename : python/jsmin/jsmin/test.py => third_party/python/jsmin/jsmin/test.py rename : python/jsmin/setup.cfg => third_party/python/jsmin/setup.cfg rename : python/jsmin/setup.py => third_party/python/jsmin/setup.py rename : python/lldbutils/README.txt => third_party/python/lldbutils/README.txt rename : python/lldbutils/lldbutils/__init__.py => third_party/python/lldbutils/lldbutils/__init__.py rename : python/lldbutils/lldbutils/content.py => third_party/python/lldbutils/lldbutils/content.py rename : python/lldbutils/lldbutils/general.py => third_party/python/lldbutils/lldbutils/general.py rename : python/lldbutils/lldbutils/gfx.py => third_party/python/lldbutils/lldbutils/gfx.py rename : python/lldbutils/lldbutils/layout.py => third_party/python/lldbutils/lldbutils/layout.py rename : python/lldbutils/lldbutils/utils.py => third_party/python/lldbutils/lldbutils/utils.py rename : python/mock-1.0.0/LICENSE.txt => third_party/python/mock-1.0.0/LICENSE.txt rename : python/mock-1.0.0/MANIFEST.in => third_party/python/mock-1.0.0/MANIFEST.in rename : python/mock-1.0.0/PKG-INFO => third_party/python/mock-1.0.0/PKG-INFO rename : python/mock-1.0.0/README.txt => third_party/python/mock-1.0.0/README.txt rename : python/mock-1.0.0/docs/changelog.txt => third_party/python/mock-1.0.0/docs/changelog.txt rename : python/mock-1.0.0/docs/compare.txt => third_party/python/mock-1.0.0/docs/compare.txt rename : python/mock-1.0.0/docs/conf.py => third_party/python/mock-1.0.0/docs/conf.py rename : python/mock-1.0.0/docs/examples.txt => third_party/python/mock-1.0.0/docs/examples.txt rename : python/mock-1.0.0/docs/getting-started.txt => third_party/python/mock-1.0.0/docs/getting-started.txt rename : python/mock-1.0.0/docs/helpers.txt => third_party/python/mock-1.0.0/docs/helpers.txt rename : python/mock-1.0.0/docs/index.txt => third_party/python/mock-1.0.0/docs/index.txt rename : python/mock-1.0.0/docs/magicmock.txt => third_party/python/mock-1.0.0/docs/magicmock.txt rename : python/mock-1.0.0/docs/mock.txt => third_party/python/mock-1.0.0/docs/mock.txt rename : python/mock-1.0.0/docs/patch.txt => third_party/python/mock-1.0.0/docs/patch.txt rename : python/mock-1.0.0/docs/sentinel.txt => third_party/python/mock-1.0.0/docs/sentinel.txt rename : python/mock-1.0.0/html/.doctrees/changelog.doctree => third_party/python/mock-1.0.0/html/.doctrees/changelog.doctree rename : python/mock-1.0.0/html/.doctrees/compare.doctree => third_party/python/mock-1.0.0/html/.doctrees/compare.doctree rename : python/mock-1.0.0/html/.doctrees/examples.doctree => third_party/python/mock-1.0.0/html/.doctrees/examples.doctree rename : python/mock-1.0.0/html/.doctrees/getting-started.doctree => third_party/python/mock-1.0.0/html/.doctrees/getting-started.doctree rename : python/mock-1.0.0/html/.doctrees/index.doctree => third_party/python/mock-1.0.0/html/.doctrees/index.doctree rename : python/mock-1.0.0/html/.doctrees/magicmock.doctree => third_party/python/mock-1.0.0/html/.doctrees/magicmock.doctree rename : python/mock-1.0.0/html/.doctrees/mock.doctree => third_party/python/mock-1.0.0/html/.doctrees/mock.doctree rename : python/mock-1.0.0/html/.doctrees/mocksignature.doctree => third_party/python/mock-1.0.0/html/.doctrees/mocksignature.doctree rename : python/mock-1.0.0/html/.doctrees/patch.doctree => third_party/python/mock-1.0.0/html/.doctrees/patch.doctree rename : python/mock-1.0.0/html/.doctrees/sentinel.doctree => third_party/python/mock-1.0.0/html/.doctrees/sentinel.doctree rename : python/mock-1.0.0/html/_sources/changelog.txt => third_party/python/mock-1.0.0/html/_sources/changelog.txt rename : python/mock-1.0.0/html/_sources/compare.txt => third_party/python/mock-1.0.0/html/_sources/compare.txt rename : python/mock-1.0.0/html/_sources/examples.txt => third_party/python/mock-1.0.0/html/_sources/examples.txt rename : python/mock-1.0.0/html/_sources/getting-started.txt => third_party/python/mock-1.0.0/html/_sources/getting-started.txt rename : python/mock-1.0.0/html/_sources/index.txt => third_party/python/mock-1.0.0/html/_sources/index.txt rename : python/mock-1.0.0/html/_sources/magicmock.txt => third_party/python/mock-1.0.0/html/_sources/magicmock.txt rename : python/mock-1.0.0/html/_sources/mock.txt => third_party/python/mock-1.0.0/html/_sources/mock.txt rename : python/mock-1.0.0/html/_sources/mocksignature.txt => third_party/python/mock-1.0.0/html/_sources/mocksignature.txt rename : python/mock-1.0.0/html/_sources/patch.txt => third_party/python/mock-1.0.0/html/_sources/patch.txt rename : python/mock-1.0.0/html/_sources/sentinel.txt => third_party/python/mock-1.0.0/html/_sources/sentinel.txt rename : python/mock-1.0.0/html/_static/adctheme.css => third_party/python/mock-1.0.0/html/_static/adctheme.css rename : python/mock-1.0.0/html/_static/basic.css => third_party/python/mock-1.0.0/html/_static/basic.css rename : python/mock-1.0.0/html/_static/breadcrumb_background.png => third_party/python/mock-1.0.0/html/_static/breadcrumb_background.png rename : python/mock-1.0.0/html/_static/default.css => third_party/python/mock-1.0.0/html/_static/default.css rename : python/mock-1.0.0/html/_static/doctools.js => third_party/python/mock-1.0.0/html/_static/doctools.js rename : python/mock-1.0.0/html/_static/documentation.png => third_party/python/mock-1.0.0/html/_static/documentation.png rename : python/mock-1.0.0/html/_static/file.png => third_party/python/mock-1.0.0/html/_static/file.png rename : python/mock-1.0.0/html/_static/header_sm_mid.png => third_party/python/mock-1.0.0/html/_static/header_sm_mid.png rename : python/mock-1.0.0/html/_static/jquery.js => third_party/python/mock-1.0.0/html/_static/jquery.js rename : python/mock-1.0.0/html/_static/minus.png => third_party/python/mock-1.0.0/html/_static/minus.png rename : python/mock-1.0.0/html/_static/mobile.css => third_party/python/mock-1.0.0/html/_static/mobile.css rename : python/mock-1.0.0/html/_static/plus.png => third_party/python/mock-1.0.0/html/_static/plus.png rename : python/mock-1.0.0/html/_static/pygments.css => third_party/python/mock-1.0.0/html/_static/pygments.css rename : python/mock-1.0.0/html/_static/scrn1.png => third_party/python/mock-1.0.0/html/_static/scrn1.png rename : python/mock-1.0.0/html/_static/scrn2.png => third_party/python/mock-1.0.0/html/_static/scrn2.png rename : python/mock-1.0.0/html/_static/searchfield_leftcap.png => third_party/python/mock-1.0.0/html/_static/searchfield_leftcap.png rename : python/mock-1.0.0/html/_static/searchfield_repeat.png => third_party/python/mock-1.0.0/html/_static/searchfield_repeat.png rename : python/mock-1.0.0/html/_static/searchfield_rightcap.png => third_party/python/mock-1.0.0/html/_static/searchfield_rightcap.png rename : python/mock-1.0.0/html/_static/searchtools.js => third_party/python/mock-1.0.0/html/_static/searchtools.js rename : python/mock-1.0.0/html/_static/sidebar.js => third_party/python/mock-1.0.0/html/_static/sidebar.js rename : python/mock-1.0.0/html/_static/title_background.png => third_party/python/mock-1.0.0/html/_static/title_background.png rename : python/mock-1.0.0/html/_static/toc.js => third_party/python/mock-1.0.0/html/_static/toc.js rename : python/mock-1.0.0/html/_static/triangle_closed.png => third_party/python/mock-1.0.0/html/_static/triangle_closed.png rename : python/mock-1.0.0/html/_static/triangle_left.png => third_party/python/mock-1.0.0/html/_static/triangle_left.png rename : python/mock-1.0.0/html/_static/triangle_open.png => third_party/python/mock-1.0.0/html/_static/triangle_open.png rename : python/mock-1.0.0/html/_static/underscore.js => third_party/python/mock-1.0.0/html/_static/underscore.js rename : python/mock-1.0.0/html/changelog.html => third_party/python/mock-1.0.0/html/changelog.html rename : python/mock-1.0.0/html/compare.html => third_party/python/mock-1.0.0/html/compare.html rename : python/mock-1.0.0/html/examples.html => third_party/python/mock-1.0.0/html/examples.html rename : python/mock-1.0.0/html/genindex.html => third_party/python/mock-1.0.0/html/genindex.html rename : python/mock-1.0.0/html/getting-started.html => third_party/python/mock-1.0.0/html/getting-started.html rename : python/mock-1.0.0/html/index.html => third_party/python/mock-1.0.0/html/index.html rename : python/mock-1.0.0/html/magicmock.html => third_party/python/mock-1.0.0/html/magicmock.html rename : python/mock-1.0.0/html/mock.html => third_party/python/mock-1.0.0/html/mock.html rename : python/mock-1.0.0/html/mocksignature.html => third_party/python/mock-1.0.0/html/mocksignature.html rename : python/mock-1.0.0/html/objects.inv => third_party/python/mock-1.0.0/html/objects.inv rename : python/mock-1.0.0/html/output.txt => third_party/python/mock-1.0.0/html/output.txt rename : python/mock-1.0.0/html/patch.html => third_party/python/mock-1.0.0/html/patch.html rename : python/mock-1.0.0/html/search.html => third_party/python/mock-1.0.0/html/search.html rename : python/mock-1.0.0/html/searchindex.js => third_party/python/mock-1.0.0/html/searchindex.js rename : python/mock-1.0.0/html/sentinel.html => third_party/python/mock-1.0.0/html/sentinel.html rename : python/mock-1.0.0/mock.egg-info/PKG-INFO => third_party/python/mock-1.0.0/mock.egg-info/PKG-INFO rename : python/mock-1.0.0/mock.egg-info/SOURCES.txt => third_party/python/mock-1.0.0/mock.egg-info/SOURCES.txt rename : python/mock-1.0.0/mock.egg-info/dependency_links.txt => third_party/python/mock-1.0.0/mock.egg-info/dependency_links.txt rename : python/mock-1.0.0/mock.egg-info/top_level.txt => third_party/python/mock-1.0.0/mock.egg-info/top_level.txt rename : python/mock-1.0.0/mock.py => third_party/python/mock-1.0.0/mock.py rename : python/mock-1.0.0/setup.cfg => third_party/python/mock-1.0.0/setup.cfg rename : python/mock-1.0.0/setup.py => third_party/python/mock-1.0.0/setup.py rename : python/mock-1.0.0/tests/__init__.py => third_party/python/mock-1.0.0/tests/__init__.py rename : python/mock-1.0.0/tests/_testwith.py => third_party/python/mock-1.0.0/tests/_testwith.py rename : python/mock-1.0.0/tests/support.py => third_party/python/mock-1.0.0/tests/support.py rename : python/mock-1.0.0/tests/support_with.py => third_party/python/mock-1.0.0/tests/support_with.py rename : python/mock-1.0.0/tests/testcallable.py => third_party/python/mock-1.0.0/tests/testcallable.py rename : python/mock-1.0.0/tests/testhelpers.py => third_party/python/mock-1.0.0/tests/testhelpers.py rename : python/mock-1.0.0/tests/testmagicmethods.py => third_party/python/mock-1.0.0/tests/testmagicmethods.py rename : python/mock-1.0.0/tests/testmock.py => third_party/python/mock-1.0.0/tests/testmock.py rename : python/mock-1.0.0/tests/testpatch.py => third_party/python/mock-1.0.0/tests/testpatch.py rename : python/mock-1.0.0/tests/testsentinel.py => third_party/python/mock-1.0.0/tests/testsentinel.py rename : python/mock-1.0.0/tests/testwith.py => third_party/python/mock-1.0.0/tests/testwith.py rename : python/mock-1.0.0/tox.ini => third_party/python/mock-1.0.0/tox.ini rename : python/psutil/CREDITS => third_party/python/psutil/CREDITS rename : python/psutil/HISTORY.rst => third_party/python/psutil/HISTORY.rst rename : python/psutil/INSTALL.rst => third_party/python/psutil/INSTALL.rst rename : python/psutil/LICENSE => third_party/python/psutil/LICENSE rename : python/psutil/MANIFEST.in => third_party/python/psutil/MANIFEST.in rename : python/psutil/Makefile => third_party/python/psutil/Makefile rename : python/psutil/PKG-INFO => third_party/python/psutil/PKG-INFO rename : python/psutil/README.rst => third_party/python/psutil/README.rst rename : python/psutil/TODO => third_party/python/psutil/TODO rename : python/psutil/docs/Makefile => third_party/python/psutil/docs/Makefile rename : python/psutil/docs/README => third_party/python/psutil/docs/README rename : python/psutil/docs/_static/copybutton.js => third_party/python/psutil/docs/_static/copybutton.js rename : python/psutil/docs/_static/favicon.ico => third_party/python/psutil/docs/_static/favicon.ico rename : python/psutil/docs/_static/logo.png => third_party/python/psutil/docs/_static/logo.png rename : python/psutil/docs/_static/sidebar.js => third_party/python/psutil/docs/_static/sidebar.js rename : python/psutil/docs/_template/globaltoc.html => third_party/python/psutil/docs/_template/globaltoc.html rename : python/psutil/docs/_template/indexcontent.html => third_party/python/psutil/docs/_template/indexcontent.html rename : python/psutil/docs/_template/indexsidebar.html => third_party/python/psutil/docs/_template/indexsidebar.html rename : python/psutil/docs/_template/page.html => third_party/python/psutil/docs/_template/page.html rename : python/psutil/docs/_themes/pydoctheme/static/pydoctheme.css => third_party/python/psutil/docs/_themes/pydoctheme/static/pydoctheme.css rename : python/psutil/docs/_themes/pydoctheme/theme.conf => third_party/python/psutil/docs/_themes/pydoctheme/theme.conf rename : python/psutil/docs/conf.py => third_party/python/psutil/docs/conf.py rename : python/psutil/docs/index.rst => third_party/python/psutil/docs/index.rst rename : python/psutil/docs/make.bat => third_party/python/psutil/docs/make.bat rename : python/psutil/docs/xxx => third_party/python/psutil/docs/xxx rename : python/psutil/examples/disk_usage.py => third_party/python/psutil/examples/disk_usage.py rename : python/psutil/examples/free.py => third_party/python/psutil/examples/free.py rename : python/psutil/examples/ifconfig.py => third_party/python/psutil/examples/ifconfig.py rename : python/psutil/examples/iotop.py => third_party/python/psutil/examples/iotop.py rename : python/psutil/examples/killall.py => third_party/python/psutil/examples/killall.py rename : python/psutil/examples/meminfo.py => third_party/python/psutil/examples/meminfo.py rename : python/psutil/examples/netstat.py => third_party/python/psutil/examples/netstat.py rename : python/psutil/examples/nettop.py => third_party/python/psutil/examples/nettop.py rename : python/psutil/examples/pidof.py => third_party/python/psutil/examples/pidof.py rename : python/psutil/examples/pmap.py => third_party/python/psutil/examples/pmap.py rename : python/psutil/examples/process_detail.py => third_party/python/psutil/examples/process_detail.py rename : python/psutil/examples/ps.py => third_party/python/psutil/examples/ps.py rename : python/psutil/examples/pstree.py => third_party/python/psutil/examples/pstree.py rename : python/psutil/examples/top.py => third_party/python/psutil/examples/top.py rename : python/psutil/examples/who.py => third_party/python/psutil/examples/who.py rename : python/psutil/make.bat => third_party/python/psutil/make.bat rename : python/psutil/psutil.egg-info/PKG-INFO => third_party/python/psutil/psutil.egg-info/PKG-INFO rename : python/psutil/psutil.egg-info/SOURCES.txt => third_party/python/psutil/psutil.egg-info/SOURCES.txt rename : python/psutil/psutil.egg-info/dependency_links.txt => third_party/python/psutil/psutil.egg-info/dependency_links.txt rename : python/psutil/psutil.egg-info/top_level.txt => third_party/python/psutil/psutil.egg-info/top_level.txt rename : python/psutil/psutil/__init__.py => third_party/python/psutil/psutil/__init__.py rename : python/psutil/psutil/_common.py => third_party/python/psutil/psutil/_common.py rename : python/psutil/psutil/_compat.py => third_party/python/psutil/psutil/_compat.py rename : python/psutil/psutil/_psbsd.py => third_party/python/psutil/psutil/_psbsd.py rename : python/psutil/psutil/_pslinux.py => third_party/python/psutil/psutil/_pslinux.py rename : python/psutil/psutil/_psosx.py => third_party/python/psutil/psutil/_psosx.py rename : python/psutil/psutil/_psposix.py => third_party/python/psutil/psutil/_psposix.py rename : python/psutil/psutil/_pssunos.py => third_party/python/psutil/psutil/_pssunos.py rename : python/psutil/psutil/_psutil_bsd.c => third_party/python/psutil/psutil/_psutil_bsd.c rename : python/psutil/psutil/_psutil_bsd.h => third_party/python/psutil/psutil/_psutil_bsd.h rename : python/psutil/psutil/_psutil_common.c => third_party/python/psutil/psutil/_psutil_common.c rename : python/psutil/psutil/_psutil_common.h => third_party/python/psutil/psutil/_psutil_common.h rename : python/psutil/psutil/_psutil_linux.c => third_party/python/psutil/psutil/_psutil_linux.c rename : python/psutil/psutil/_psutil_linux.h => third_party/python/psutil/psutil/_psutil_linux.h rename : python/psutil/psutil/_psutil_osx.c => third_party/python/psutil/psutil/_psutil_osx.c rename : python/psutil/psutil/_psutil_osx.h => third_party/python/psutil/psutil/_psutil_osx.h rename : python/psutil/psutil/_psutil_posix.c => third_party/python/psutil/psutil/_psutil_posix.c rename : python/psutil/psutil/_psutil_posix.h => third_party/python/psutil/psutil/_psutil_posix.h rename : python/psutil/psutil/_psutil_sunos.c => third_party/python/psutil/psutil/_psutil_sunos.c rename : python/psutil/psutil/_psutil_sunos.h => third_party/python/psutil/psutil/_psutil_sunos.h rename : python/psutil/psutil/_psutil_windows.c => third_party/python/psutil/psutil/_psutil_windows.c rename : python/psutil/psutil/_psutil_windows.h => third_party/python/psutil/psutil/_psutil_windows.h rename : python/psutil/psutil/_pswindows.py => third_party/python/psutil/psutil/_pswindows.py rename : python/psutil/psutil/arch/bsd/process_info.c => third_party/python/psutil/psutil/arch/bsd/process_info.c rename : python/psutil/psutil/arch/bsd/process_info.h => third_party/python/psutil/psutil/arch/bsd/process_info.h rename : python/psutil/psutil/arch/osx/process_info.c => third_party/python/psutil/psutil/arch/osx/process_info.c rename : python/psutil/psutil/arch/osx/process_info.h => third_party/python/psutil/psutil/arch/osx/process_info.h rename : python/psutil/psutil/arch/windows/glpi.h => third_party/python/psutil/psutil/arch/windows/glpi.h rename : python/psutil/psutil/arch/windows/inet_ntop.c => third_party/python/psutil/psutil/arch/windows/inet_ntop.c rename : python/psutil/psutil/arch/windows/inet_ntop.h => third_party/python/psutil/psutil/arch/windows/inet_ntop.h rename : python/psutil/psutil/arch/windows/ntextapi.h => third_party/python/psutil/psutil/arch/windows/ntextapi.h rename : python/psutil/psutil/arch/windows/process_handles.c => third_party/python/psutil/psutil/arch/windows/process_handles.c rename : python/psutil/psutil/arch/windows/process_handles.h => third_party/python/psutil/psutil/arch/windows/process_handles.h rename : python/psutil/psutil/arch/windows/process_info.c => third_party/python/psutil/psutil/arch/windows/process_info.c rename : python/psutil/psutil/arch/windows/process_info.h => third_party/python/psutil/psutil/arch/windows/process_info.h rename : python/psutil/psutil/arch/windows/security.c => third_party/python/psutil/psutil/arch/windows/security.c rename : python/psutil/psutil/arch/windows/security.h => third_party/python/psutil/psutil/arch/windows/security.h rename : python/psutil/setup.cfg => third_party/python/psutil/setup.cfg rename : python/psutil/setup.py => third_party/python/psutil/setup.py rename : python/psutil/test/README.rst => third_party/python/psutil/test/README.rst rename : python/psutil/test/_bsd.py => third_party/python/psutil/test/_bsd.py rename : python/psutil/test/_linux.py => third_party/python/psutil/test/_linux.py rename : python/psutil/test/_osx.py => third_party/python/psutil/test/_osx.py rename : python/psutil/test/_posix.py => third_party/python/psutil/test/_posix.py rename : python/psutil/test/_sunos.py => third_party/python/psutil/test/_sunos.py rename : python/psutil/test/_windows.py => third_party/python/psutil/test/_windows.py rename : python/psutil/test/test_memory_leaks.py => third_party/python/psutil/test/test_memory_leaks.py rename : python/psutil/test/test_psutil.py => third_party/python/psutil/test/test_psutil.py rename : python/psutil/tox.ini => third_party/python/psutil/tox.ini rename : python/py/AUTHORS => third_party/python/py/AUTHORS rename : python/py/LICENSE => third_party/python/py/LICENSE rename : python/py/MANIFEST.in => third_party/python/py/MANIFEST.in rename : python/py/PKG-INFO => third_party/python/py/PKG-INFO rename : python/py/README.txt => third_party/python/py/README.txt rename : python/py/py/__init__.py => third_party/python/py/py/__init__.py rename : python/py/py/__metainfo.py => third_party/python/py/py/__metainfo.py rename : python/py/py/_apipkg.py => third_party/python/py/py/_apipkg.py rename : python/py/py/_builtin.py => third_party/python/py/py/_builtin.py rename : python/py/py/_code/__init__.py => third_party/python/py/py/_code/__init__.py rename : python/py/py/_code/_assertionnew.py => third_party/python/py/py/_code/_assertionnew.py rename : python/py/py/_code/_assertionold.py => third_party/python/py/py/_code/_assertionold.py rename : python/py/py/_code/_py2traceback.py => third_party/python/py/py/_code/_py2traceback.py rename : python/py/py/_code/assertion.py => third_party/python/py/py/_code/assertion.py rename : python/py/py/_code/code.py => third_party/python/py/py/_code/code.py rename : python/py/py/_code/source.py => third_party/python/py/py/_code/source.py rename : python/py/py/_error.py => third_party/python/py/py/_error.py rename : python/py/py/_iniconfig.py => third_party/python/py/py/_iniconfig.py rename : python/py/py/_io/__init__.py => third_party/python/py/py/_io/__init__.py rename : python/py/py/_io/capture.py => third_party/python/py/py/_io/capture.py rename : python/py/py/_io/saferepr.py => third_party/python/py/py/_io/saferepr.py rename : python/py/py/_io/terminalwriter.py => third_party/python/py/py/_io/terminalwriter.py rename : python/py/py/_log/__init__.py => third_party/python/py/py/_log/__init__.py rename : python/py/py/_log/log.py => third_party/python/py/py/_log/log.py rename : python/py/py/_log/warning.py => third_party/python/py/py/_log/warning.py rename : python/py/py/_path/__init__.py => third_party/python/py/py/_path/__init__.py rename : python/py/py/_path/cacheutil.py => third_party/python/py/py/_path/cacheutil.py rename : python/py/py/_path/common.py => third_party/python/py/py/_path/common.py rename : python/py/py/_path/local.py => third_party/python/py/py/_path/local.py rename : python/py/py/_path/svnurl.py => third_party/python/py/py/_path/svnurl.py rename : python/py/py/_path/svnwc.py => third_party/python/py/py/_path/svnwc.py rename : python/py/py/_process/__init__.py => third_party/python/py/py/_process/__init__.py rename : python/py/py/_process/cmdexec.py => third_party/python/py/py/_process/cmdexec.py rename : python/py/py/_process/forkedfunc.py => third_party/python/py/py/_process/forkedfunc.py rename : python/py/py/_process/killproc.py => third_party/python/py/py/_process/killproc.py rename : python/py/py/_std.py => third_party/python/py/py/_std.py rename : python/py/py/_xmlgen.py => third_party/python/py/py/_xmlgen.py rename : python/py/py/test.py => third_party/python/py/py/test.py rename : python/py/setup.cfg => third_party/python/py/setup.cfg rename : python/py/setup.py => third_party/python/py/setup.py rename : python/pyasn1-modules/CHANGES => third_party/python/pyasn1-modules/CHANGES rename : python/pyasn1-modules/LICENSE => third_party/python/pyasn1-modules/LICENSE rename : python/pyasn1-modules/MANIFEST.in => third_party/python/pyasn1-modules/MANIFEST.in rename : python/pyasn1-modules/PKG-INFO => third_party/python/pyasn1-modules/PKG-INFO rename : python/pyasn1-modules/README => third_party/python/pyasn1-modules/README rename : python/pyasn1-modules/pyasn1_modules.egg-info/PKG-INFO => third_party/python/pyasn1-modules/pyasn1_modules.egg-info/PKG-INFO rename : python/pyasn1-modules/pyasn1_modules.egg-info/SOURCES.txt => third_party/python/pyasn1-modules/pyasn1_modules.egg-info/SOURCES.txt rename : python/pyasn1-modules/pyasn1_modules.egg-info/dependency_links.txt => third_party/python/pyasn1-modules/pyasn1_modules.egg-info/dependency_links.txt rename : python/pyasn1-modules/pyasn1_modules.egg-info/requires.txt => third_party/python/pyasn1-modules/pyasn1_modules.egg-info/requires.txt rename : python/pyasn1-modules/pyasn1_modules.egg-info/top_level.txt => third_party/python/pyasn1-modules/pyasn1_modules.egg-info/top_level.txt rename : python/pyasn1-modules/pyasn1_modules.egg-info/zip-safe => third_party/python/pyasn1-modules/pyasn1_modules.egg-info/zip-safe rename : python/pyasn1-modules/pyasn1_modules/__init__.py => third_party/python/pyasn1-modules/pyasn1_modules/__init__.py rename : python/pyasn1-modules/pyasn1_modules/pem.py => third_party/python/pyasn1-modules/pyasn1_modules/pem.py rename : python/pyasn1-modules/pyasn1_modules/pkcs12.py => third_party/python/pyasn1-modules/pyasn1_modules/pkcs12.py rename : python/pyasn1-modules/pyasn1_modules/rfc1155.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc1155.py rename : python/pyasn1-modules/pyasn1_modules/rfc1157.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc1157.py rename : python/pyasn1-modules/pyasn1_modules/rfc1901.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc1901.py rename : python/pyasn1-modules/pyasn1_modules/rfc1902.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc1902.py rename : python/pyasn1-modules/pyasn1_modules/rfc1905.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc1905.py rename : python/pyasn1-modules/pyasn1_modules/rfc2251.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc2251.py rename : python/pyasn1-modules/pyasn1_modules/rfc2314.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc2314.py rename : python/pyasn1-modules/pyasn1_modules/rfc2315.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc2315.py rename : python/pyasn1-modules/pyasn1_modules/rfc2437.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc2437.py rename : python/pyasn1-modules/pyasn1_modules/rfc2459.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc2459.py rename : python/pyasn1-modules/pyasn1_modules/rfc2511.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc2511.py rename : python/pyasn1-modules/pyasn1_modules/rfc2560.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc2560.py rename : python/pyasn1-modules/pyasn1_modules/rfc3412.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc3412.py rename : python/pyasn1-modules/pyasn1_modules/rfc3414.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc3414.py rename : python/pyasn1-modules/pyasn1_modules/rfc3447.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc3447.py rename : python/pyasn1-modules/pyasn1_modules/rfc4210.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc4210.py rename : python/pyasn1-modules/pyasn1_modules/rfc5208.py => third_party/python/pyasn1-modules/pyasn1_modules/rfc5208.py rename : python/pyasn1-modules/setup.cfg => third_party/python/pyasn1-modules/setup.cfg rename : python/pyasn1-modules/setup.py => third_party/python/pyasn1-modules/setup.py rename : python/pyasn1-modules/test/cmp.sh => third_party/python/pyasn1-modules/test/cmp.sh rename : python/pyasn1-modules/test/crl.sh => third_party/python/pyasn1-modules/test/crl.sh rename : python/pyasn1-modules/test/crmf.sh => third_party/python/pyasn1-modules/test/crmf.sh rename : python/pyasn1-modules/test/ocspreq.sh => third_party/python/pyasn1-modules/test/ocspreq.sh rename : python/pyasn1-modules/test/ocsprsp.sh => third_party/python/pyasn1-modules/test/ocsprsp.sh rename : python/pyasn1-modules/test/pkcs1.sh => third_party/python/pyasn1-modules/test/pkcs1.sh rename : python/pyasn1-modules/test/pkcs10.sh => third_party/python/pyasn1-modules/test/pkcs10.sh rename : python/pyasn1-modules/test/pkcs7.sh => third_party/python/pyasn1-modules/test/pkcs7.sh rename : python/pyasn1-modules/test/pkcs8.sh => third_party/python/pyasn1-modules/test/pkcs8.sh rename : python/pyasn1-modules/test/x509dump.sh => third_party/python/pyasn1-modules/test/x509dump.sh rename : python/pyasn1-modules/tools/cmpdump.py => third_party/python/pyasn1-modules/tools/cmpdump.py rename : python/pyasn1-modules/tools/crldump.py => third_party/python/pyasn1-modules/tools/crldump.py rename : python/pyasn1-modules/tools/crmfdump.py => third_party/python/pyasn1-modules/tools/crmfdump.py rename : python/pyasn1-modules/tools/ocspclient.py => third_party/python/pyasn1-modules/tools/ocspclient.py rename : python/pyasn1-modules/tools/ocspreqdump.py => third_party/python/pyasn1-modules/tools/ocspreqdump.py rename : python/pyasn1-modules/tools/ocsprspdump.py => third_party/python/pyasn1-modules/tools/ocsprspdump.py rename : python/pyasn1-modules/tools/ocspserver.py => third_party/python/pyasn1-modules/tools/ocspserver.py rename : python/pyasn1-modules/tools/pkcs10dump.py => third_party/python/pyasn1-modules/tools/pkcs10dump.py rename : python/pyasn1-modules/tools/pkcs1dump.py => third_party/python/pyasn1-modules/tools/pkcs1dump.py rename : python/pyasn1-modules/tools/pkcs7dump.py => third_party/python/pyasn1-modules/tools/pkcs7dump.py rename : python/pyasn1-modules/tools/pkcs8dump.py => third_party/python/pyasn1-modules/tools/pkcs8dump.py rename : python/pyasn1-modules/tools/snmpget.py => third_party/python/pyasn1-modules/tools/snmpget.py rename : python/pyasn1-modules/tools/x509dump.py => third_party/python/pyasn1-modules/tools/x509dump.py rename : python/pyasn1/CHANGES => third_party/python/pyasn1/CHANGES rename : python/pyasn1/LICENSE => third_party/python/pyasn1/LICENSE rename : python/pyasn1/MANIFEST.in => third_party/python/pyasn1/MANIFEST.in rename : python/pyasn1/PKG-INFO => third_party/python/pyasn1/PKG-INFO rename : python/pyasn1/README => third_party/python/pyasn1/README rename : python/pyasn1/THANKS => third_party/python/pyasn1/THANKS rename : python/pyasn1/TODO => third_party/python/pyasn1/TODO rename : python/pyasn1/doc/codecs.html => third_party/python/pyasn1/doc/codecs.html rename : python/pyasn1/doc/constraints.html => third_party/python/pyasn1/doc/constraints.html rename : python/pyasn1/doc/constructed.html => third_party/python/pyasn1/doc/constructed.html rename : python/pyasn1/doc/intro.html => third_party/python/pyasn1/doc/intro.html rename : python/pyasn1/doc/pyasn1-tutorial.html => third_party/python/pyasn1/doc/pyasn1-tutorial.html rename : python/pyasn1/doc/scalar.html => third_party/python/pyasn1/doc/scalar.html rename : python/pyasn1/doc/tagging.html => third_party/python/pyasn1/doc/tagging.html rename : python/pyasn1/pyasn1.egg-info/PKG-INFO => third_party/python/pyasn1/pyasn1.egg-info/PKG-INFO rename : python/pyasn1/pyasn1.egg-info/SOURCES.txt => third_party/python/pyasn1/pyasn1.egg-info/SOURCES.txt rename : python/pyasn1/pyasn1.egg-info/dependency_links.txt => third_party/python/pyasn1/pyasn1.egg-info/dependency_links.txt rename : python/pyasn1/pyasn1.egg-info/top_level.txt => third_party/python/pyasn1/pyasn1.egg-info/top_level.txt rename : python/pyasn1/pyasn1.egg-info/zip-safe => third_party/python/pyasn1/pyasn1.egg-info/zip-safe rename : python/pyasn1/pyasn1/__init__.py => third_party/python/pyasn1/pyasn1/__init__.py rename : python/pyasn1/pyasn1/codec/__init__.py => third_party/python/pyasn1/pyasn1/codec/__init__.py rename : python/pyasn1/pyasn1/codec/ber/__init__.py => third_party/python/pyasn1/pyasn1/codec/ber/__init__.py rename : python/pyasn1/pyasn1/codec/ber/decoder.py => third_party/python/pyasn1/pyasn1/codec/ber/decoder.py rename : python/pyasn1/pyasn1/codec/ber/encoder.py => third_party/python/pyasn1/pyasn1/codec/ber/encoder.py rename : python/pyasn1/pyasn1/codec/ber/eoo.py => third_party/python/pyasn1/pyasn1/codec/ber/eoo.py rename : python/pyasn1/pyasn1/codec/cer/__init__.py => third_party/python/pyasn1/pyasn1/codec/cer/__init__.py rename : python/pyasn1/pyasn1/codec/cer/decoder.py => third_party/python/pyasn1/pyasn1/codec/cer/decoder.py rename : python/pyasn1/pyasn1/codec/cer/encoder.py => third_party/python/pyasn1/pyasn1/codec/cer/encoder.py rename : python/pyasn1/pyasn1/codec/der/__init__.py => third_party/python/pyasn1/pyasn1/codec/der/__init__.py rename : python/pyasn1/pyasn1/codec/der/decoder.py => third_party/python/pyasn1/pyasn1/codec/der/decoder.py rename : python/pyasn1/pyasn1/codec/der/encoder.py => third_party/python/pyasn1/pyasn1/codec/der/encoder.py rename : python/pyasn1/pyasn1/compat/__init__.py => third_party/python/pyasn1/pyasn1/compat/__init__.py rename : python/pyasn1/pyasn1/compat/octets.py => third_party/python/pyasn1/pyasn1/compat/octets.py rename : python/pyasn1/pyasn1/debug.py => third_party/python/pyasn1/pyasn1/debug.py rename : python/pyasn1/pyasn1/error.py => third_party/python/pyasn1/pyasn1/error.py rename : python/pyasn1/pyasn1/type/__init__.py => third_party/python/pyasn1/pyasn1/type/__init__.py rename : python/pyasn1/pyasn1/type/base.py => third_party/python/pyasn1/pyasn1/type/base.py rename : python/pyasn1/pyasn1/type/char.py => third_party/python/pyasn1/pyasn1/type/char.py rename : python/pyasn1/pyasn1/type/constraint.py => third_party/python/pyasn1/pyasn1/type/constraint.py rename : python/pyasn1/pyasn1/type/error.py => third_party/python/pyasn1/pyasn1/type/error.py rename : python/pyasn1/pyasn1/type/namedtype.py => third_party/python/pyasn1/pyasn1/type/namedtype.py rename : python/pyasn1/pyasn1/type/namedval.py => third_party/python/pyasn1/pyasn1/type/namedval.py rename : python/pyasn1/pyasn1/type/tag.py => third_party/python/pyasn1/pyasn1/type/tag.py rename : python/pyasn1/pyasn1/type/tagmap.py => third_party/python/pyasn1/pyasn1/type/tagmap.py rename : python/pyasn1/pyasn1/type/univ.py => third_party/python/pyasn1/pyasn1/type/univ.py rename : python/pyasn1/pyasn1/type/useful.py => third_party/python/pyasn1/pyasn1/type/useful.py rename : python/pyasn1/setup.cfg => third_party/python/pyasn1/setup.cfg rename : python/pyasn1/setup.py => third_party/python/pyasn1/setup.py rename : python/pyasn1/test/__init__.py => third_party/python/pyasn1/test/__init__.py rename : python/pyasn1/test/codec/__init__.py => third_party/python/pyasn1/test/codec/__init__.py rename : python/pyasn1/test/codec/ber/__init__.py => third_party/python/pyasn1/test/codec/ber/__init__.py rename : python/pyasn1/test/codec/ber/suite.py => third_party/python/pyasn1/test/codec/ber/suite.py rename : python/pyasn1/test/codec/ber/test_decoder.py => third_party/python/pyasn1/test/codec/ber/test_decoder.py rename : python/pyasn1/test/codec/ber/test_encoder.py => third_party/python/pyasn1/test/codec/ber/test_encoder.py rename : python/pyasn1/test/codec/cer/__init__.py => third_party/python/pyasn1/test/codec/cer/__init__.py rename : python/pyasn1/test/codec/cer/suite.py => third_party/python/pyasn1/test/codec/cer/suite.py rename : python/pyasn1/test/codec/cer/test_decoder.py => third_party/python/pyasn1/test/codec/cer/test_decoder.py rename : python/pyasn1/test/codec/cer/test_encoder.py => third_party/python/pyasn1/test/codec/cer/test_encoder.py rename : python/pyasn1/test/codec/der/__init__.py => third_party/python/pyasn1/test/codec/der/__init__.py rename : python/pyasn1/test/codec/der/suite.py => third_party/python/pyasn1/test/codec/der/suite.py rename : python/pyasn1/test/codec/der/test_decoder.py => third_party/python/pyasn1/test/codec/der/test_decoder.py rename : python/pyasn1/test/codec/der/test_encoder.py => third_party/python/pyasn1/test/codec/der/test_encoder.py rename : python/pyasn1/test/codec/suite.py => third_party/python/pyasn1/test/codec/suite.py rename : python/pyasn1/test/suite.py => third_party/python/pyasn1/test/suite.py rename : python/pyasn1/test/type/__init__.py => third_party/python/pyasn1/test/type/__init__.py rename : python/pyasn1/test/type/suite.py => third_party/python/pyasn1/test/type/suite.py rename : python/pyasn1/test/type/test_constraint.py => third_party/python/pyasn1/test/type/test_constraint.py rename : python/pyasn1/test/type/test_namedtype.py => third_party/python/pyasn1/test/type/test_namedtype.py rename : python/pyasn1/test/type/test_tag.py => third_party/python/pyasn1/test/type/test_tag.py rename : python/pyasn1/test/type/test_univ.py => third_party/python/pyasn1/test/type/test_univ.py rename : python/pylru/pylru.py => third_party/python/pylru/pylru.py rename : python/pylru/test.py => third_party/python/pylru/test.py rename : python/pystache/.gitignore => third_party/python/pystache/.gitignore rename : python/pystache/.gitmodules => third_party/python/pystache/.gitmodules rename : python/pystache/.travis.yml => third_party/python/pystache/.travis.yml rename : python/pystache/HISTORY.md => third_party/python/pystache/HISTORY.md rename : python/pystache/LICENSE => third_party/python/pystache/LICENSE rename : python/pystache/MANIFEST.in => third_party/python/pystache/MANIFEST.in rename : python/pystache/README.md => third_party/python/pystache/README.md rename : python/pystache/TODO.md => third_party/python/pystache/TODO.md rename : python/pystache/gh/images/logo_phillips.png => third_party/python/pystache/gh/images/logo_phillips.png rename : python/pystache/pystache/__init__.py => third_party/python/pystache/pystache/__init__.py rename : python/pystache/pystache/commands/__init__.py => third_party/python/pystache/pystache/commands/__init__.py rename : python/pystache/pystache/commands/render.py => third_party/python/pystache/pystache/commands/render.py rename : python/pystache/pystache/commands/test.py => third_party/python/pystache/pystache/commands/test.py rename : python/pystache/pystache/common.py => third_party/python/pystache/pystache/common.py rename : python/pystache/pystache/context.py => third_party/python/pystache/pystache/context.py rename : python/pystache/pystache/defaults.py => third_party/python/pystache/pystache/defaults.py rename : python/pystache/pystache/init.py => third_party/python/pystache/pystache/init.py rename : python/pystache/pystache/loader.py => third_party/python/pystache/pystache/loader.py rename : python/pystache/pystache/locator.py => third_party/python/pystache/pystache/locator.py rename : python/pystache/pystache/parsed.py => third_party/python/pystache/pystache/parsed.py rename : python/pystache/pystache/parser.py => third_party/python/pystache/pystache/parser.py rename : python/pystache/pystache/renderengine.py => third_party/python/pystache/pystache/renderengine.py rename : python/pystache/pystache/renderer.py => third_party/python/pystache/pystache/renderer.py rename : python/pystache/pystache/specloader.py => third_party/python/pystache/pystache/specloader.py rename : python/pystache/pystache/template_spec.py => third_party/python/pystache/pystache/template_spec.py rename : python/pystache/setup.py => third_party/python/pystache/setup.py rename : python/pystache/setup_description.rst => third_party/python/pystache/setup_description.rst rename : python/pystache/test_pystache.py => third_party/python/pystache/test_pystache.py rename : python/pystache/tox.ini => third_party/python/pystache/tox.ini rename : python/pytest/.coveragerc => third_party/python/pytest/.coveragerc rename : python/pytest/AUTHORS => third_party/python/pytest/AUTHORS rename : python/pytest/LICENSE => third_party/python/pytest/LICENSE rename : python/pytest/MANIFEST.in => third_party/python/pytest/MANIFEST.in rename : python/pytest/PKG-INFO => third_party/python/pytest/PKG-INFO rename : python/pytest/README.rst => third_party/python/pytest/README.rst rename : python/pytest/_pytest/__init__.py => third_party/python/pytest/_pytest/__init__.py rename : python/pytest/_pytest/_argcomplete.py => third_party/python/pytest/_pytest/_argcomplete.py rename : python/pytest/_pytest/_code/__init__.py => third_party/python/pytest/_pytest/_code/__init__.py rename : python/pytest/_pytest/_code/_py2traceback.py => third_party/python/pytest/_pytest/_code/_py2traceback.py rename : python/pytest/_pytest/_code/code.py => third_party/python/pytest/_pytest/_code/code.py rename : python/pytest/_pytest/_code/source.py => third_party/python/pytest/_pytest/_code/source.py rename : python/pytest/_pytest/_pluggy.py => third_party/python/pytest/_pytest/_pluggy.py rename : python/pytest/_pytest/assertion/__init__.py => third_party/python/pytest/_pytest/assertion/__init__.py rename : python/pytest/_pytest/assertion/reinterpret.py => third_party/python/pytest/_pytest/assertion/reinterpret.py rename : python/pytest/_pytest/assertion/rewrite.py => third_party/python/pytest/_pytest/assertion/rewrite.py rename : python/pytest/_pytest/assertion/util.py => third_party/python/pytest/_pytest/assertion/util.py rename : python/pytest/_pytest/cacheprovider.py => third_party/python/pytest/_pytest/cacheprovider.py rename : python/pytest/_pytest/capture.py => third_party/python/pytest/_pytest/capture.py rename : python/pytest/_pytest/config.py => third_party/python/pytest/_pytest/config.py rename : python/pytest/_pytest/doctest.py => third_party/python/pytest/_pytest/doctest.py rename : python/pytest/_pytest/genscript.py => third_party/python/pytest/_pytest/genscript.py rename : python/pytest/_pytest/helpconfig.py => third_party/python/pytest/_pytest/helpconfig.py rename : python/pytest/_pytest/hookspec.py => third_party/python/pytest/_pytest/hookspec.py rename : python/pytest/_pytest/junitxml.py => third_party/python/pytest/_pytest/junitxml.py rename : python/pytest/_pytest/main.py => third_party/python/pytest/_pytest/main.py rename : python/pytest/_pytest/mark.py => third_party/python/pytest/_pytest/mark.py rename : python/pytest/_pytest/monkeypatch.py => third_party/python/pytest/_pytest/monkeypatch.py rename : python/pytest/_pytest/nose.py => third_party/python/pytest/_pytest/nose.py rename : python/pytest/_pytest/pastebin.py => third_party/python/pytest/_pytest/pastebin.py rename : python/pytest/_pytest/pdb.py => third_party/python/pytest/_pytest/pdb.py rename : python/pytest/_pytest/pytester.py => third_party/python/pytest/_pytest/pytester.py rename : python/pytest/_pytest/python.py => third_party/python/pytest/_pytest/python.py rename : python/pytest/_pytest/recwarn.py => third_party/python/pytest/_pytest/recwarn.py rename : python/pytest/_pytest/resultlog.py => third_party/python/pytest/_pytest/resultlog.py rename : python/pytest/_pytest/runner.py => third_party/python/pytest/_pytest/runner.py rename : python/pytest/_pytest/skipping.py => third_party/python/pytest/_pytest/skipping.py rename : python/pytest/_pytest/standalonetemplate.py => third_party/python/pytest/_pytest/standalonetemplate.py rename : python/pytest/_pytest/terminal.py => third_party/python/pytest/_pytest/terminal.py rename : python/pytest/_pytest/tmpdir.py => third_party/python/pytest/_pytest/tmpdir.py rename : python/pytest/_pytest/unittest.py => third_party/python/pytest/_pytest/unittest.py rename : python/pytest/_pytest/vendored_packages/README.md => third_party/python/pytest/_pytest/vendored_packages/README.md rename : python/pytest/_pytest/vendored_packages/__init__.py => third_party/python/pytest/_pytest/vendored_packages/__init__.py rename : python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/DESCRIPTION.rst => third_party/python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/DESCRIPTION.rst rename : python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/METADATA => third_party/python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/METADATA rename : python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/RECORD => third_party/python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/RECORD rename : python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/WHEEL => third_party/python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/WHEEL rename : python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/metadata.json => third_party/python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/metadata.json rename : python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/pbr.json => third_party/python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/pbr.json rename : python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/top_level.txt => third_party/python/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/top_level.txt rename : python/pytest/_pytest/vendored_packages/pluggy.py => third_party/python/pytest/_pytest/vendored_packages/pluggy.py rename : python/pytest/pytest.py => third_party/python/pytest/pytest.py rename : python/pytest/setup.cfg => third_party/python/pytest/setup.cfg rename : python/pytest/setup.py => third_party/python/pytest/setup.py rename : python/pytoml/PKG-INFO => third_party/python/pytoml/PKG-INFO rename : python/pytoml/pytoml/__init__.py => third_party/python/pytoml/pytoml/__init__.py rename : python/pytoml/pytoml/core.py => third_party/python/pytoml/pytoml/core.py rename : python/pytoml/pytoml/parser.py => third_party/python/pytoml/pytoml/parser.py rename : python/pytoml/pytoml/writer.py => third_party/python/pytoml/pytoml/writer.py rename : python/pytoml/setup.cfg => third_party/python/pytoml/setup.cfg rename : python/pytoml/setup.py => third_party/python/pytoml/setup.py rename : python/pytoml/test/test.py => third_party/python/pytoml/test/test.py rename : python/pyyaml/CHANGES => third_party/python/pyyaml/CHANGES rename : python/pyyaml/LICENSE => third_party/python/pyyaml/LICENSE rename : python/pyyaml/PKG-INFO => third_party/python/pyyaml/PKG-INFO rename : python/pyyaml/README => third_party/python/pyyaml/README rename : python/pyyaml/examples/pygments-lexer/example.yaml => third_party/python/pyyaml/examples/pygments-lexer/example.yaml rename : python/pyyaml/examples/pygments-lexer/yaml.py => third_party/python/pyyaml/examples/pygments-lexer/yaml.py rename : python/pyyaml/examples/yaml-highlight/yaml_hl.cfg => third_party/python/pyyaml/examples/yaml-highlight/yaml_hl.cfg rename : python/pyyaml/examples/yaml-highlight/yaml_hl.py => third_party/python/pyyaml/examples/yaml-highlight/yaml_hl.py rename : python/pyyaml/ext/_yaml.c => third_party/python/pyyaml/ext/_yaml.c rename : python/pyyaml/ext/_yaml.h => third_party/python/pyyaml/ext/_yaml.h rename : python/pyyaml/ext/_yaml.pxd => third_party/python/pyyaml/ext/_yaml.pxd rename : python/pyyaml/ext/_yaml.pyx => third_party/python/pyyaml/ext/_yaml.pyx rename : python/pyyaml/lib/yaml/__init__.py => third_party/python/pyyaml/lib/yaml/__init__.py rename : python/pyyaml/lib/yaml/composer.py => third_party/python/pyyaml/lib/yaml/composer.py rename : python/pyyaml/lib/yaml/constructor.py => third_party/python/pyyaml/lib/yaml/constructor.py rename : python/pyyaml/lib/yaml/cyaml.py => third_party/python/pyyaml/lib/yaml/cyaml.py rename : python/pyyaml/lib/yaml/dumper.py => third_party/python/pyyaml/lib/yaml/dumper.py rename : python/pyyaml/lib/yaml/emitter.py => third_party/python/pyyaml/lib/yaml/emitter.py rename : python/pyyaml/lib/yaml/error.py => third_party/python/pyyaml/lib/yaml/error.py rename : python/pyyaml/lib/yaml/events.py => third_party/python/pyyaml/lib/yaml/events.py rename : python/pyyaml/lib/yaml/loader.py => third_party/python/pyyaml/lib/yaml/loader.py rename : python/pyyaml/lib/yaml/nodes.py => third_party/python/pyyaml/lib/yaml/nodes.py rename : python/pyyaml/lib/yaml/parser.py => third_party/python/pyyaml/lib/yaml/parser.py rename : python/pyyaml/lib/yaml/reader.py => third_party/python/pyyaml/lib/yaml/reader.py rename : python/pyyaml/lib/yaml/representer.py => third_party/python/pyyaml/lib/yaml/representer.py rename : python/pyyaml/lib/yaml/resolver.py => third_party/python/pyyaml/lib/yaml/resolver.py rename : python/pyyaml/lib/yaml/scanner.py => third_party/python/pyyaml/lib/yaml/scanner.py rename : python/pyyaml/lib/yaml/serializer.py => third_party/python/pyyaml/lib/yaml/serializer.py rename : python/pyyaml/lib/yaml/tokens.py => third_party/python/pyyaml/lib/yaml/tokens.py rename : python/pyyaml/lib3/yaml/__init__.py => third_party/python/pyyaml/lib3/yaml/__init__.py rename : python/pyyaml/lib3/yaml/composer.py => third_party/python/pyyaml/lib3/yaml/composer.py rename : python/pyyaml/lib3/yaml/constructor.py => third_party/python/pyyaml/lib3/yaml/constructor.py rename : python/pyyaml/lib3/yaml/cyaml.py => third_party/python/pyyaml/lib3/yaml/cyaml.py rename : python/pyyaml/lib3/yaml/dumper.py => third_party/python/pyyaml/lib3/yaml/dumper.py rename : python/pyyaml/lib3/yaml/emitter.py => third_party/python/pyyaml/lib3/yaml/emitter.py rename : python/pyyaml/lib3/yaml/error.py => third_party/python/pyyaml/lib3/yaml/error.py rename : python/pyyaml/lib3/yaml/events.py => third_party/python/pyyaml/lib3/yaml/events.py rename : python/pyyaml/lib3/yaml/loader.py => third_party/python/pyyaml/lib3/yaml/loader.py rename : python/pyyaml/lib3/yaml/nodes.py => third_party/python/pyyaml/lib3/yaml/nodes.py rename : python/pyyaml/lib3/yaml/parser.py => third_party/python/pyyaml/lib3/yaml/parser.py rename : python/pyyaml/lib3/yaml/reader.py => third_party/python/pyyaml/lib3/yaml/reader.py rename : python/pyyaml/lib3/yaml/representer.py => third_party/python/pyyaml/lib3/yaml/representer.py rename : python/pyyaml/lib3/yaml/resolver.py => third_party/python/pyyaml/lib3/yaml/resolver.py rename : python/pyyaml/lib3/yaml/scanner.py => third_party/python/pyyaml/lib3/yaml/scanner.py rename : python/pyyaml/lib3/yaml/serializer.py => third_party/python/pyyaml/lib3/yaml/serializer.py rename : python/pyyaml/lib3/yaml/tokens.py => third_party/python/pyyaml/lib3/yaml/tokens.py rename : python/pyyaml/setup.cfg => third_party/python/pyyaml/setup.cfg rename : python/pyyaml/setup.py => third_party/python/pyyaml/setup.py rename : python/redo/PKG-INFO => third_party/python/redo/PKG-INFO rename : python/redo/README => third_party/python/redo/README rename : python/redo/redo.egg-info/PKG-INFO => third_party/python/redo/redo.egg-info/PKG-INFO rename : python/redo/redo.egg-info/SOURCES.txt => third_party/python/redo/redo.egg-info/SOURCES.txt rename : python/redo/redo.egg-info/dependency_links.txt => third_party/python/redo/redo.egg-info/dependency_links.txt rename : python/redo/redo.egg-info/entry_points.txt => third_party/python/redo/redo.egg-info/entry_points.txt rename : python/redo/redo.egg-info/top_level.txt => third_party/python/redo/redo.egg-info/top_level.txt rename : python/redo/redo/__init__.py => third_party/python/redo/redo/__init__.py rename : python/redo/redo/cmd.py => third_party/python/redo/redo/cmd.py rename : python/redo/setup.cfg => third_party/python/redo/setup.cfg rename : python/redo/setup.py => third_party/python/redo/setup.py rename : python/requests/HISTORY.rst => third_party/python/requests/HISTORY.rst rename : python/requests/LICENSE => third_party/python/requests/LICENSE rename : python/requests/MANIFEST.in => third_party/python/requests/MANIFEST.in rename : python/requests/NOTICE => third_party/python/requests/NOTICE rename : python/requests/PKG-INFO => third_party/python/requests/PKG-INFO rename : python/requests/README.rst => third_party/python/requests/README.rst rename : python/requests/requests.egg-info/PKG-INFO => third_party/python/requests/requests.egg-info/PKG-INFO rename : python/requests/requests.egg-info/SOURCES.txt => third_party/python/requests/requests.egg-info/SOURCES.txt rename : python/requests/requests.egg-info/dependency_links.txt => third_party/python/requests/requests.egg-info/dependency_links.txt rename : python/requests/requests.egg-info/not-zip-safe => third_party/python/requests/requests.egg-info/not-zip-safe rename : python/requests/requests.egg-info/requires.txt => third_party/python/requests/requests.egg-info/requires.txt rename : python/requests/requests.egg-info/top_level.txt => third_party/python/requests/requests.egg-info/top_level.txt rename : python/requests/requests/__init__.py => third_party/python/requests/requests/__init__.py rename : python/requests/requests/adapters.py => third_party/python/requests/requests/adapters.py rename : python/requests/requests/api.py => third_party/python/requests/requests/api.py rename : python/requests/requests/auth.py => third_party/python/requests/requests/auth.py rename : python/requests/requests/cacert.pem => third_party/python/requests/requests/cacert.pem rename : python/requests/requests/certs.py => third_party/python/requests/requests/certs.py rename : python/requests/requests/compat.py => third_party/python/requests/requests/compat.py rename : python/requests/requests/cookies.py => third_party/python/requests/requests/cookies.py rename : python/requests/requests/exceptions.py => third_party/python/requests/requests/exceptions.py rename : python/requests/requests/hooks.py => third_party/python/requests/requests/hooks.py rename : python/requests/requests/models.py => third_party/python/requests/requests/models.py rename : python/requests/requests/packages/__init__.py => third_party/python/requests/requests/packages/__init__.py rename : python/requests/requests/packages/chardet/__init__.py => third_party/python/requests/requests/packages/chardet/__init__.py rename : python/requests/requests/packages/chardet/big5freq.py => third_party/python/requests/requests/packages/chardet/big5freq.py rename : python/requests/requests/packages/chardet/big5prober.py => third_party/python/requests/requests/packages/chardet/big5prober.py rename : python/requests/requests/packages/chardet/chardetect.py => third_party/python/requests/requests/packages/chardet/chardetect.py rename : python/requests/requests/packages/chardet/chardistribution.py => third_party/python/requests/requests/packages/chardet/chardistribution.py rename : python/requests/requests/packages/chardet/charsetgroupprober.py => third_party/python/requests/requests/packages/chardet/charsetgroupprober.py rename : python/requests/requests/packages/chardet/charsetprober.py => third_party/python/requests/requests/packages/chardet/charsetprober.py rename : python/requests/requests/packages/chardet/codingstatemachine.py => third_party/python/requests/requests/packages/chardet/codingstatemachine.py rename : python/requests/requests/packages/chardet/compat.py => third_party/python/requests/requests/packages/chardet/compat.py rename : python/requests/requests/packages/chardet/constants.py => third_party/python/requests/requests/packages/chardet/constants.py rename : python/requests/requests/packages/chardet/cp949prober.py => third_party/python/requests/requests/packages/chardet/cp949prober.py rename : python/requests/requests/packages/chardet/escprober.py => third_party/python/requests/requests/packages/chardet/escprober.py rename : python/requests/requests/packages/chardet/escsm.py => third_party/python/requests/requests/packages/chardet/escsm.py rename : python/requests/requests/packages/chardet/eucjpprober.py => third_party/python/requests/requests/packages/chardet/eucjpprober.py rename : python/requests/requests/packages/chardet/euckrfreq.py => third_party/python/requests/requests/packages/chardet/euckrfreq.py rename : python/requests/requests/packages/chardet/euckrprober.py => third_party/python/requests/requests/packages/chardet/euckrprober.py rename : python/requests/requests/packages/chardet/euctwfreq.py => third_party/python/requests/requests/packages/chardet/euctwfreq.py rename : python/requests/requests/packages/chardet/euctwprober.py => third_party/python/requests/requests/packages/chardet/euctwprober.py rename : python/requests/requests/packages/chardet/gb2312freq.py => third_party/python/requests/requests/packages/chardet/gb2312freq.py rename : python/requests/requests/packages/chardet/gb2312prober.py => third_party/python/requests/requests/packages/chardet/gb2312prober.py rename : python/requests/requests/packages/chardet/hebrewprober.py => third_party/python/requests/requests/packages/chardet/hebrewprober.py rename : python/requests/requests/packages/chardet/jisfreq.py => third_party/python/requests/requests/packages/chardet/jisfreq.py rename : python/requests/requests/packages/chardet/jpcntx.py => third_party/python/requests/requests/packages/chardet/jpcntx.py rename : python/requests/requests/packages/chardet/langbulgarianmodel.py => third_party/python/requests/requests/packages/chardet/langbulgarianmodel.py rename : python/requests/requests/packages/chardet/langcyrillicmodel.py => third_party/python/requests/requests/packages/chardet/langcyrillicmodel.py rename : python/requests/requests/packages/chardet/langgreekmodel.py => third_party/python/requests/requests/packages/chardet/langgreekmodel.py rename : python/requests/requests/packages/chardet/langhebrewmodel.py => third_party/python/requests/requests/packages/chardet/langhebrewmodel.py rename : python/requests/requests/packages/chardet/langhungarianmodel.py => third_party/python/requests/requests/packages/chardet/langhungarianmodel.py rename : python/requests/requests/packages/chardet/langthaimodel.py => third_party/python/requests/requests/packages/chardet/langthaimodel.py rename : python/requests/requests/packages/chardet/latin1prober.py => third_party/python/requests/requests/packages/chardet/latin1prober.py rename : python/requests/requests/packages/chardet/mbcharsetprober.py => third_party/python/requests/requests/packages/chardet/mbcharsetprober.py rename : python/requests/requests/packages/chardet/mbcsgroupprober.py => third_party/python/requests/requests/packages/chardet/mbcsgroupprober.py rename : python/requests/requests/packages/chardet/mbcssm.py => third_party/python/requests/requests/packages/chardet/mbcssm.py rename : python/requests/requests/packages/chardet/sbcharsetprober.py => third_party/python/requests/requests/packages/chardet/sbcharsetprober.py rename : python/requests/requests/packages/chardet/sbcsgroupprober.py => third_party/python/requests/requests/packages/chardet/sbcsgroupprober.py rename : python/requests/requests/packages/chardet/sjisprober.py => third_party/python/requests/requests/packages/chardet/sjisprober.py rename : python/requests/requests/packages/chardet/universaldetector.py => third_party/python/requests/requests/packages/chardet/universaldetector.py rename : python/requests/requests/packages/chardet/utf8prober.py => third_party/python/requests/requests/packages/chardet/utf8prober.py rename : python/requests/requests/packages/urllib3/__init__.py => third_party/python/requests/requests/packages/urllib3/__init__.py rename : python/requests/requests/packages/urllib3/_collections.py => third_party/python/requests/requests/packages/urllib3/_collections.py rename : python/requests/requests/packages/urllib3/connection.py => third_party/python/requests/requests/packages/urllib3/connection.py rename : python/requests/requests/packages/urllib3/connectionpool.py => third_party/python/requests/requests/packages/urllib3/connectionpool.py rename : python/requests/requests/packages/urllib3/contrib/__init__.py => third_party/python/requests/requests/packages/urllib3/contrib/__init__.py rename : python/requests/requests/packages/urllib3/contrib/appengine.py => third_party/python/requests/requests/packages/urllib3/contrib/appengine.py rename : python/requests/requests/packages/urllib3/contrib/ntlmpool.py => third_party/python/requests/requests/packages/urllib3/contrib/ntlmpool.py rename : python/requests/requests/packages/urllib3/contrib/pyopenssl.py => third_party/python/requests/requests/packages/urllib3/contrib/pyopenssl.py rename : python/requests/requests/packages/urllib3/exceptions.py => third_party/python/requests/requests/packages/urllib3/exceptions.py rename : python/requests/requests/packages/urllib3/fields.py => third_party/python/requests/requests/packages/urllib3/fields.py rename : python/requests/requests/packages/urllib3/filepost.py => third_party/python/requests/requests/packages/urllib3/filepost.py rename : python/requests/requests/packages/urllib3/packages/__init__.py => third_party/python/requests/requests/packages/urllib3/packages/__init__.py rename : python/requests/requests/packages/urllib3/packages/ordered_dict.py => third_party/python/requests/requests/packages/urllib3/packages/ordered_dict.py rename : python/requests/requests/packages/urllib3/packages/six.py => third_party/python/requests/requests/packages/urllib3/packages/six.py rename : python/requests/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py => third_party/python/requests/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py rename : python/requests/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py => third_party/python/requests/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py rename : python/requests/requests/packages/urllib3/poolmanager.py => third_party/python/requests/requests/packages/urllib3/poolmanager.py rename : python/requests/requests/packages/urllib3/request.py => third_party/python/requests/requests/packages/urllib3/request.py rename : python/requests/requests/packages/urllib3/response.py => third_party/python/requests/requests/packages/urllib3/response.py rename : python/requests/requests/packages/urllib3/util/__init__.py => third_party/python/requests/requests/packages/urllib3/util/__init__.py rename : python/requests/requests/packages/urllib3/util/connection.py => third_party/python/requests/requests/packages/urllib3/util/connection.py rename : python/requests/requests/packages/urllib3/util/request.py => third_party/python/requests/requests/packages/urllib3/util/request.py rename : python/requests/requests/packages/urllib3/util/response.py => third_party/python/requests/requests/packages/urllib3/util/response.py rename : python/requests/requests/packages/urllib3/util/retry.py => third_party/python/requests/requests/packages/urllib3/util/retry.py rename : python/requests/requests/packages/urllib3/util/ssl_.py => third_party/python/requests/requests/packages/urllib3/util/ssl_.py rename : python/requests/requests/packages/urllib3/util/timeout.py => third_party/python/requests/requests/packages/urllib3/util/timeout.py rename : python/requests/requests/packages/urllib3/util/url.py => third_party/python/requests/requests/packages/urllib3/util/url.py rename : python/requests/requests/sessions.py => third_party/python/requests/requests/sessions.py rename : python/requests/requests/status_codes.py => third_party/python/requests/requests/status_codes.py rename : python/requests/requests/structures.py => third_party/python/requests/requests/structures.py rename : python/requests/requests/utils.py => third_party/python/requests/requests/utils.py rename : python/requests/requirements.txt => third_party/python/requests/requirements.txt rename : python/requests/setup.cfg => third_party/python/requests/setup.cfg rename : python/requests/setup.py => third_party/python/requests/setup.py rename : python/requests/test_requests.py => third_party/python/requests/test_requests.py rename : python/rsa/LICENSE => third_party/python/rsa/LICENSE rename : python/rsa/MANIFEST.in => third_party/python/rsa/MANIFEST.in rename : python/rsa/PKG-INFO => third_party/python/rsa/PKG-INFO rename : python/rsa/README.rst => third_party/python/rsa/README.rst rename : python/rsa/create_timing_table.py => third_party/python/rsa/create_timing_table.py rename : python/rsa/playstuff.py => third_party/python/rsa/playstuff.py rename : python/rsa/rsa.egg-info/PKG-INFO => third_party/python/rsa/rsa.egg-info/PKG-INFO rename : python/rsa/rsa.egg-info/SOURCES.txt => third_party/python/rsa/rsa.egg-info/SOURCES.txt rename : python/rsa/rsa.egg-info/dependency_links.txt => third_party/python/rsa/rsa.egg-info/dependency_links.txt rename : python/rsa/rsa.egg-info/entry_points.txt => third_party/python/rsa/rsa.egg-info/entry_points.txt rename : python/rsa/rsa.egg-info/requires.txt => third_party/python/rsa/rsa.egg-info/requires.txt rename : python/rsa/rsa.egg-info/top_level.txt => third_party/python/rsa/rsa.egg-info/top_level.txt rename : python/rsa/rsa/__init__.py => third_party/python/rsa/rsa/__init__.py rename : python/rsa/rsa/_compat.py => third_party/python/rsa/rsa/_compat.py rename : python/rsa/rsa/_version133.py => third_party/python/rsa/rsa/_version133.py rename : python/rsa/rsa/_version200.py => third_party/python/rsa/rsa/_version200.py rename : python/rsa/rsa/asn1.py => third_party/python/rsa/rsa/asn1.py rename : python/rsa/rsa/bigfile.py => third_party/python/rsa/rsa/bigfile.py rename : python/rsa/rsa/cli.py => third_party/python/rsa/rsa/cli.py rename : python/rsa/rsa/common.py => third_party/python/rsa/rsa/common.py rename : python/rsa/rsa/core.py => third_party/python/rsa/rsa/core.py rename : python/rsa/rsa/key.py => third_party/python/rsa/rsa/key.py rename : python/rsa/rsa/parallel.py => third_party/python/rsa/rsa/parallel.py rename : python/rsa/rsa/pem.py => third_party/python/rsa/rsa/pem.py rename : python/rsa/rsa/pkcs1.py => third_party/python/rsa/rsa/pkcs1.py rename : python/rsa/rsa/prime.py => third_party/python/rsa/rsa/prime.py rename : python/rsa/rsa/randnum.py => third_party/python/rsa/rsa/randnum.py rename : python/rsa/rsa/transform.py => third_party/python/rsa/rsa/transform.py rename : python/rsa/rsa/util.py => third_party/python/rsa/rsa/util.py rename : python/rsa/rsa/varblock.py => third_party/python/rsa/rsa/varblock.py rename : python/rsa/run_tests.py => third_party/python/rsa/run_tests.py rename : python/rsa/setup.cfg => third_party/python/rsa/setup.cfg rename : python/rsa/setup.py => third_party/python/rsa/setup.py rename : python/rsa/tests/__init__.py => third_party/python/rsa/tests/__init__.py rename : python/rsa/tests/constants.py => third_party/python/rsa/tests/constants.py rename : python/rsa/tests/py2kconstants.py => third_party/python/rsa/tests/py2kconstants.py rename : python/rsa/tests/py3kconstants.py => third_party/python/rsa/tests/py3kconstants.py rename : python/rsa/tests/test_bigfile.py => third_party/python/rsa/tests/test_bigfile.py rename : python/rsa/tests/test_common.py => third_party/python/rsa/tests/test_common.py rename : python/rsa/tests/test_compat.py => third_party/python/rsa/tests/test_compat.py rename : python/rsa/tests/test_integers.py => third_party/python/rsa/tests/test_integers.py rename : python/rsa/tests/test_load_save_keys.py => third_party/python/rsa/tests/test_load_save_keys.py rename : python/rsa/tests/test_pem.py => third_party/python/rsa/tests/test_pem.py rename : python/rsa/tests/test_pkcs1.py => third_party/python/rsa/tests/test_pkcs1.py rename : python/rsa/tests/test_strings.py => third_party/python/rsa/tests/test_strings.py rename : python/rsa/tests/test_transform.py => third_party/python/rsa/tests/test_transform.py rename : python/rsa/tests/test_varblock.py => third_party/python/rsa/tests/test_varblock.py rename : python/slugid/.gitignore => third_party/python/slugid/.gitignore rename : python/slugid/.travis.yml => third_party/python/slugid/.travis.yml rename : python/slugid/LICENSE => third_party/python/slugid/LICENSE rename : python/slugid/README.rst => third_party/python/slugid/README.rst rename : python/slugid/requirements.txt => third_party/python/slugid/requirements.txt rename : python/slugid/setup.py => third_party/python/slugid/setup.py rename : python/slugid/slugid/__init__.py => third_party/python/slugid/slugid/__init__.py rename : python/slugid/slugid/slugid.py => third_party/python/slugid/slugid/slugid.py rename : python/slugid/test.py => third_party/python/slugid/test.py rename : python/slugid/tox.ini => third_party/python/slugid/tox.ini rename : python/virtualenv/AUTHORS.txt => third_party/python/virtualenv/AUTHORS.txt rename : python/virtualenv/LICENSE.txt => third_party/python/virtualenv/LICENSE.txt rename : python/virtualenv/MANIFEST.in => third_party/python/virtualenv/MANIFEST.in rename : python/virtualenv/PKG-INFO => third_party/python/virtualenv/PKG-INFO rename : python/virtualenv/README.rst => third_party/python/virtualenv/README.rst rename : python/virtualenv/bin/rebuild-script.py => third_party/python/virtualenv/bin/rebuild-script.py rename : python/virtualenv/docs/Makefile => third_party/python/virtualenv/docs/Makefile rename : python/virtualenv/docs/changes.rst => third_party/python/virtualenv/docs/changes.rst rename : python/virtualenv/docs/conf.py => third_party/python/virtualenv/docs/conf.py rename : python/virtualenv/docs/development.rst => third_party/python/virtualenv/docs/development.rst rename : python/virtualenv/docs/index.rst => third_party/python/virtualenv/docs/index.rst rename : python/virtualenv/docs/installation.rst => third_party/python/virtualenv/docs/installation.rst rename : python/virtualenv/docs/make.bat => third_party/python/virtualenv/docs/make.bat rename : python/virtualenv/docs/reference.rst => third_party/python/virtualenv/docs/reference.rst rename : python/virtualenv/docs/userguide.rst => third_party/python/virtualenv/docs/userguide.rst rename : python/virtualenv/scripts/virtualenv => third_party/python/virtualenv/scripts/virtualenv rename : python/virtualenv/setup.cfg => third_party/python/virtualenv/setup.cfg rename : python/virtualenv/setup.py => third_party/python/virtualenv/setup.py rename : python/virtualenv/site.py => third_party/python/virtualenv/site.py rename : python/virtualenv/tests/__init__.py => third_party/python/virtualenv/tests/__init__.py rename : python/virtualenv/tests/test_activate.sh => third_party/python/virtualenv/tests/test_activate.sh rename : python/virtualenv/tests/test_activate_output.expected => third_party/python/virtualenv/tests/test_activate_output.expected rename : python/virtualenv/tests/test_cmdline.py => third_party/python/virtualenv/tests/test_cmdline.py rename : python/virtualenv/tests/test_virtualenv.py => third_party/python/virtualenv/tests/test_virtualenv.py rename : python/virtualenv/virtualenv.py => third_party/python/virtualenv/virtualenv.py rename : python/virtualenv/virtualenv_embedded/activate.bat => third_party/python/virtualenv/virtualenv_embedded/activate.bat rename : python/virtualenv/virtualenv_embedded/activate.csh => third_party/python/virtualenv/virtualenv_embedded/activate.csh rename : python/virtualenv/virtualenv_embedded/activate.fish => third_party/python/virtualenv/virtualenv_embedded/activate.fish rename : python/virtualenv/virtualenv_embedded/activate.ps1 => third_party/python/virtualenv/virtualenv_embedded/activate.ps1 rename : python/virtualenv/virtualenv_embedded/activate.sh => third_party/python/virtualenv/virtualenv_embedded/activate.sh rename : python/virtualenv/virtualenv_embedded/activate_this.py => third_party/python/virtualenv/virtualenv_embedded/activate_this.py rename : python/virtualenv/virtualenv_embedded/deactivate.bat => third_party/python/virtualenv/virtualenv_embedded/deactivate.bat rename : python/virtualenv/virtualenv_embedded/distutils-init.py => third_party/python/virtualenv/virtualenv_embedded/distutils-init.py rename : python/virtualenv/virtualenv_embedded/distutils.cfg => third_party/python/virtualenv/virtualenv_embedded/distutils.cfg rename : python/virtualenv/virtualenv_embedded/python-config => third_party/python/virtualenv/virtualenv_embedded/python-config rename : python/virtualenv/virtualenv_embedded/site.py => third_party/python/virtualenv/virtualenv_embedded/site.py rename : python/virtualenv/virtualenv_support/__init__.py => third_party/python/virtualenv/virtualenv_support/__init__.py rename : python/virtualenv/virtualenv_support/argparse-1.4.0-py2.py3-none-any.whl => third_party/python/virtualenv/virtualenv_support/argparse-1.4.0-py2.py3-none-any.whl rename : python/virtualenv/virtualenv_support/pip-8.1.2-py2.py3-none-any.whl => third_party/python/virtualenv/virtualenv_support/pip-8.1.2-py2.py3-none-any.whl rename : python/virtualenv/virtualenv_support/setuptools-25.2.0-py2.py3-none-any.whl => third_party/python/virtualenv/virtualenv_support/setuptools-25.2.0-py2.py3-none-any.whl rename : python/virtualenv/virtualenv_support/wheel-0.29.0-py2.py3-none-any.whl => third_party/python/virtualenv/virtualenv_support/wheel-0.29.0-py2.py3-none-any.whl rename : python/voluptuous/COPYING => third_party/python/voluptuous/COPYING rename : python/voluptuous/MANIFEST.in => third_party/python/voluptuous/MANIFEST.in rename : python/voluptuous/PKG-INFO => third_party/python/voluptuous/PKG-INFO rename : python/voluptuous/README.md => third_party/python/voluptuous/README.md rename : python/voluptuous/README.rst => third_party/python/voluptuous/README.rst rename : python/voluptuous/setup.cfg => third_party/python/voluptuous/setup.cfg rename : python/voluptuous/setup.py => third_party/python/voluptuous/setup.py rename : python/voluptuous/tests.md => third_party/python/voluptuous/tests.md rename : python/voluptuous/voluptuous.py => third_party/python/voluptuous/voluptuous.py rename : python/which/LICENSE.txt => third_party/python/which/LICENSE.txt rename : python/which/MANIFEST.in => third_party/python/which/MANIFEST.in rename : python/which/Makefile.win => third_party/python/which/Makefile.win rename : python/which/PKG-INFO => third_party/python/which/PKG-INFO rename : python/which/README.txt => third_party/python/which/README.txt rename : python/which/TODO.txt => third_party/python/which/TODO.txt rename : python/which/build.py => third_party/python/which/build.py rename : python/which/launcher.cpp => third_party/python/which/launcher.cpp rename : python/which/logo.jpg => third_party/python/which/logo.jpg rename : python/which/setup.py => third_party/python/which/setup.py rename : python/which/test/test_which.py => third_party/python/which/test/test_which.py rename : python/which/test/testsupport.py => third_party/python/which/test/testsupport.py rename : python/which/which.py => third_party/python/which/which.py extra : rebase_source : fc38848c444c36b0d38a0c33aa5be74d5037d57d
		
			
				
	
	
		
			2468 lines
		
	
	
	
		
			86 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			2468 lines
		
	
	
	
		
			86 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# configobj.py
 | 
						|
# A config file reader/writer that supports nested sections in config files.
 | 
						|
# Copyright (C) 2005-2010 Michael Foord, Nicola Larosa
 | 
						|
# E-mail: fuzzyman AT voidspace DOT org DOT uk
 | 
						|
#         nico AT tekNico DOT net
 | 
						|
 | 
						|
# ConfigObj 4
 | 
						|
# http://www.voidspace.org.uk/python/configobj.html
 | 
						|
 | 
						|
# Released subject to the BSD License
 | 
						|
# Please see http://www.voidspace.org.uk/python/license.shtml
 | 
						|
 | 
						|
# Scripts maintained at http://www.voidspace.org.uk/python/index.shtml
 | 
						|
# For information about bugfixes, updates and support, please join the
 | 
						|
# ConfigObj mailing list:
 | 
						|
# http://lists.sourceforge.net/lists/listinfo/configobj-develop
 | 
						|
# Comments, suggestions and bug reports welcome.
 | 
						|
 | 
						|
from __future__ import generators
 | 
						|
 | 
						|
import os
 | 
						|
import re
 | 
						|
import sys
 | 
						|
 | 
						|
from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF16_BE, BOM_UTF16_LE
 | 
						|
 | 
						|
 | 
						|
# imported lazily to avoid startup performance hit if it isn't used
 | 
						|
compiler = None
 | 
						|
 | 
						|
# A dictionary mapping BOM to
 | 
						|
# the encoding to decode with, and what to set the
 | 
						|
# encoding attribute to.
 | 
						|
BOMS = {
 | 
						|
    BOM_UTF8: ('utf_8', None),
 | 
						|
    BOM_UTF16_BE: ('utf16_be', 'utf_16'),
 | 
						|
    BOM_UTF16_LE: ('utf16_le', 'utf_16'),
 | 
						|
    BOM_UTF16: ('utf_16', 'utf_16'),
 | 
						|
    }
 | 
						|
# All legal variants of the BOM codecs.
 | 
						|
# TODO: the list of aliases is not meant to be exhaustive, is there a
 | 
						|
#   better way ?
 | 
						|
BOM_LIST = {
 | 
						|
    'utf_16': 'utf_16',
 | 
						|
    'u16': 'utf_16',
 | 
						|
    'utf16': 'utf_16',
 | 
						|
    'utf-16': 'utf_16',
 | 
						|
    'utf16_be': 'utf16_be',
 | 
						|
    'utf_16_be': 'utf16_be',
 | 
						|
    'utf-16be': 'utf16_be',
 | 
						|
    'utf16_le': 'utf16_le',
 | 
						|
    'utf_16_le': 'utf16_le',
 | 
						|
    'utf-16le': 'utf16_le',
 | 
						|
    'utf_8': 'utf_8',
 | 
						|
    'u8': 'utf_8',
 | 
						|
    'utf': 'utf_8',
 | 
						|
    'utf8': 'utf_8',
 | 
						|
    'utf-8': 'utf_8',
 | 
						|
    }
 | 
						|
 | 
						|
# Map of encodings to the BOM to write.
 | 
						|
BOM_SET = {
 | 
						|
    'utf_8': BOM_UTF8,
 | 
						|
    'utf_16': BOM_UTF16,
 | 
						|
    'utf16_be': BOM_UTF16_BE,
 | 
						|
    'utf16_le': BOM_UTF16_LE,
 | 
						|
    None: BOM_UTF8
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
def match_utf8(encoding):
 | 
						|
    return BOM_LIST.get(encoding.lower()) == 'utf_8'
 | 
						|
 | 
						|
 | 
						|
# Quote strings used for writing values
 | 
						|
squot = "'%s'"
 | 
						|
dquot = '"%s"'
 | 
						|
noquot = "%s"
 | 
						|
wspace_plus = ' \r\n\v\t\'"'
 | 
						|
tsquot = '"""%s"""'
 | 
						|
tdquot = "'''%s'''"
 | 
						|
 | 
						|
# Sentinel for use in getattr calls to replace hasattr
 | 
						|
MISSING = object()
 | 
						|
 | 
						|
__version__ = '4.7.2'
 | 
						|
 | 
						|
try:
 | 
						|
    any
 | 
						|
except NameError:
 | 
						|
    def any(iterable):
 | 
						|
        for entry in iterable:
 | 
						|
            if entry:
 | 
						|
                return True
 | 
						|
        return False
 | 
						|
 | 
						|
 | 
						|
__all__ = (
 | 
						|
    '__version__',
 | 
						|
    'DEFAULT_INDENT_TYPE',
 | 
						|
    'DEFAULT_INTERPOLATION',
 | 
						|
    'ConfigObjError',
 | 
						|
    'NestingError',
 | 
						|
    'ParseError',
 | 
						|
    'DuplicateError',
 | 
						|
    'ConfigspecError',
 | 
						|
    'ConfigObj',
 | 
						|
    'SimpleVal',
 | 
						|
    'InterpolationError',
 | 
						|
    'InterpolationLoopError',
 | 
						|
    'MissingInterpolationOption',
 | 
						|
    'RepeatSectionError',
 | 
						|
    'ReloadError',
 | 
						|
    'UnreprError',
 | 
						|
    'UnknownType',
 | 
						|
    'flatten_errors',
 | 
						|
    'get_extra_values'
 | 
						|
)
 | 
						|
 | 
						|
DEFAULT_INTERPOLATION = 'configparser'
 | 
						|
DEFAULT_INDENT_TYPE = '    '
 | 
						|
MAX_INTERPOL_DEPTH = 10
 | 
						|
 | 
						|
OPTION_DEFAULTS = {
 | 
						|
    'interpolation': True,
 | 
						|
    'raise_errors': False,
 | 
						|
    'list_values': True,
 | 
						|
    'create_empty': False,
 | 
						|
    'file_error': False,
 | 
						|
    'configspec': None,
 | 
						|
    'stringify': True,
 | 
						|
    # option may be set to one of ('', ' ', '\t')
 | 
						|
    'indent_type': None,
 | 
						|
    'encoding': None,
 | 
						|
    'default_encoding': None,
 | 
						|
    'unrepr': False,
 | 
						|
    'write_empty_values': False,
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
def getObj(s):
 | 
						|
    global compiler
 | 
						|
    if compiler is None:
 | 
						|
        import compiler
 | 
						|
    s = "a=" + s
 | 
						|
    p = compiler.parse(s)
 | 
						|
    return p.getChildren()[1].getChildren()[0].getChildren()[1]
 | 
						|
 | 
						|
 | 
						|
class UnknownType(Exception):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class Builder(object):
 | 
						|
    
 | 
						|
    def build(self, o):
 | 
						|
        m = getattr(self, 'build_' + o.__class__.__name__, None)
 | 
						|
        if m is None:
 | 
						|
            raise UnknownType(o.__class__.__name__)
 | 
						|
        return m(o)
 | 
						|
    
 | 
						|
    def build_List(self, o):
 | 
						|
        return map(self.build, o.getChildren())
 | 
						|
    
 | 
						|
    def build_Const(self, o):
 | 
						|
        return o.value
 | 
						|
    
 | 
						|
    def build_Dict(self, o):
 | 
						|
        d = {}
 | 
						|
        i = iter(map(self.build, o.getChildren()))
 | 
						|
        for el in i:
 | 
						|
            d[el] = i.next()
 | 
						|
        return d
 | 
						|
    
 | 
						|
    def build_Tuple(self, o):
 | 
						|
        return tuple(self.build_List(o))
 | 
						|
    
 | 
						|
    def build_Name(self, o):
 | 
						|
        if o.name == 'None':
 | 
						|
            return None
 | 
						|
        if o.name == 'True':
 | 
						|
            return True
 | 
						|
        if o.name == 'False':
 | 
						|
            return False
 | 
						|
        
 | 
						|
        # An undefined Name
 | 
						|
        raise UnknownType('Undefined Name')
 | 
						|
    
 | 
						|
    def build_Add(self, o):
 | 
						|
        real, imag = map(self.build_Const, o.getChildren())
 | 
						|
        try:
 | 
						|
            real = float(real)
 | 
						|
        except TypeError:
 | 
						|
            raise UnknownType('Add')
 | 
						|
        if not isinstance(imag, complex) or imag.real != 0.0:
 | 
						|
            raise UnknownType('Add')
 | 
						|
        return real+imag
 | 
						|
    
 | 
						|
    def build_Getattr(self, o):
 | 
						|
        parent = self.build(o.expr)
 | 
						|
        return getattr(parent, o.attrname)
 | 
						|
    
 | 
						|
    def build_UnarySub(self, o):
 | 
						|
        return -self.build_Const(o.getChildren()[0])
 | 
						|
    
 | 
						|
    def build_UnaryAdd(self, o):
 | 
						|
        return self.build_Const(o.getChildren()[0])
 | 
						|
 | 
						|
 | 
						|
_builder = Builder()
 | 
						|
 | 
						|
 | 
						|
def unrepr(s):
 | 
						|
    if not s:
 | 
						|
        return s
 | 
						|
    return _builder.build(getObj(s))
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class ConfigObjError(SyntaxError):
 | 
						|
    """
 | 
						|
    This is the base class for all errors that ConfigObj raises.
 | 
						|
    It is a subclass of SyntaxError.
 | 
						|
    """
 | 
						|
    def __init__(self, message='', line_number=None, line=''):
 | 
						|
        self.line = line
 | 
						|
        self.line_number = line_number
 | 
						|
        SyntaxError.__init__(self, message)
 | 
						|
 | 
						|
 | 
						|
class NestingError(ConfigObjError):
 | 
						|
    """
 | 
						|
    This error indicates a level of nesting that doesn't match.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class ParseError(ConfigObjError):
 | 
						|
    """
 | 
						|
    This error indicates that a line is badly written.
 | 
						|
    It is neither a valid ``key = value`` line,
 | 
						|
    nor a valid section marker line.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class ReloadError(IOError):
 | 
						|
    """
 | 
						|
    A 'reload' operation failed.
 | 
						|
    This exception is a subclass of ``IOError``.
 | 
						|
    """
 | 
						|
    def __init__(self):
 | 
						|
        IOError.__init__(self, 'reload failed, filename is not set.')
 | 
						|
 | 
						|
 | 
						|
class DuplicateError(ConfigObjError):
 | 
						|
    """
 | 
						|
    The keyword or section specified already exists.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class ConfigspecError(ConfigObjError):
 | 
						|
    """
 | 
						|
    An error occured whilst parsing a configspec.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class InterpolationError(ConfigObjError):
 | 
						|
    """Base class for the two interpolation errors."""
 | 
						|
 | 
						|
 | 
						|
class InterpolationLoopError(InterpolationError):
 | 
						|
    """Maximum interpolation depth exceeded in string interpolation."""
 | 
						|
 | 
						|
    def __init__(self, option):
 | 
						|
        InterpolationError.__init__(
 | 
						|
            self,
 | 
						|
            'interpolation loop detected in value "%s".' % option)
 | 
						|
 | 
						|
 | 
						|
class RepeatSectionError(ConfigObjError):
 | 
						|
    """
 | 
						|
    This error indicates additional sections in a section with a
 | 
						|
    ``__many__`` (repeated) section.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
class MissingInterpolationOption(InterpolationError):
 | 
						|
    """A value specified for interpolation was missing."""
 | 
						|
    def __init__(self, option):
 | 
						|
        msg = 'missing option "%s" in interpolation.' % option
 | 
						|
        InterpolationError.__init__(self, msg)
 | 
						|
 | 
						|
 | 
						|
class UnreprError(ConfigObjError):
 | 
						|
    """An error parsing in unrepr mode."""
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class InterpolationEngine(object):
 | 
						|
    """
 | 
						|
    A helper class to help perform string interpolation.
 | 
						|
 | 
						|
    This class is an abstract base class; its descendants perform
 | 
						|
    the actual work.
 | 
						|
    """
 | 
						|
 | 
						|
    # compiled regexp to use in self.interpolate()
 | 
						|
    _KEYCRE = re.compile(r"%\(([^)]*)\)s")
 | 
						|
    _cookie = '%'
 | 
						|
 | 
						|
    def __init__(self, section):
 | 
						|
        # the Section instance that "owns" this engine
 | 
						|
        self.section = section
 | 
						|
 | 
						|
 | 
						|
    def interpolate(self, key, value):
 | 
						|
        # short-cut
 | 
						|
        if not self._cookie in value:
 | 
						|
            return value
 | 
						|
        
 | 
						|
        def recursive_interpolate(key, value, section, backtrail):
 | 
						|
            """The function that does the actual work.
 | 
						|
 | 
						|
            ``value``: the string we're trying to interpolate.
 | 
						|
            ``section``: the section in which that string was found
 | 
						|
            ``backtrail``: a dict to keep track of where we've been,
 | 
						|
            to detect and prevent infinite recursion loops
 | 
						|
 | 
						|
            This is similar to a depth-first-search algorithm.
 | 
						|
            """
 | 
						|
            # Have we been here already?
 | 
						|
            if (key, section.name) in backtrail:
 | 
						|
                # Yes - infinite loop detected
 | 
						|
                raise InterpolationLoopError(key)
 | 
						|
            # Place a marker on our backtrail so we won't come back here again
 | 
						|
            backtrail[(key, section.name)] = 1
 | 
						|
 | 
						|
            # Now start the actual work
 | 
						|
            match = self._KEYCRE.search(value)
 | 
						|
            while match:
 | 
						|
                # The actual parsing of the match is implementation-dependent,
 | 
						|
                # so delegate to our helper function
 | 
						|
                k, v, s = self._parse_match(match)
 | 
						|
                if k is None:
 | 
						|
                    # That's the signal that no further interpolation is needed
 | 
						|
                    replacement = v
 | 
						|
                else:
 | 
						|
                    # Further interpolation may be needed to obtain final value
 | 
						|
                    replacement = recursive_interpolate(k, v, s, backtrail)
 | 
						|
                # Replace the matched string with its final value
 | 
						|
                start, end = match.span()
 | 
						|
                value = ''.join((value[:start], replacement, value[end:]))
 | 
						|
                new_search_start = start + len(replacement)
 | 
						|
                # Pick up the next interpolation key, if any, for next time
 | 
						|
                # through the while loop
 | 
						|
                match = self._KEYCRE.search(value, new_search_start)
 | 
						|
 | 
						|
            # Now safe to come back here again; remove marker from backtrail
 | 
						|
            del backtrail[(key, section.name)]
 | 
						|
 | 
						|
            return value
 | 
						|
 | 
						|
        # Back in interpolate(), all we have to do is kick off the recursive
 | 
						|
        # function with appropriate starting values
 | 
						|
        value = recursive_interpolate(key, value, self.section, {})
 | 
						|
        return value
 | 
						|
 | 
						|
 | 
						|
    def _fetch(self, key):
 | 
						|
        """Helper function to fetch values from owning section.
 | 
						|
 | 
						|
        Returns a 2-tuple: the value, and the section where it was found.
 | 
						|
        """
 | 
						|
        # switch off interpolation before we try and fetch anything !
 | 
						|
        save_interp = self.section.main.interpolation
 | 
						|
        self.section.main.interpolation = False
 | 
						|
 | 
						|
        # Start at section that "owns" this InterpolationEngine
 | 
						|
        current_section = self.section
 | 
						|
        while True:
 | 
						|
            # try the current section first
 | 
						|
            val = current_section.get(key)
 | 
						|
            if val is not None and not isinstance(val, Section):
 | 
						|
                break
 | 
						|
            # try "DEFAULT" next
 | 
						|
            val = current_section.get('DEFAULT', {}).get(key)
 | 
						|
            if val is not None and not isinstance(val, Section):
 | 
						|
                break
 | 
						|
            # move up to parent and try again
 | 
						|
            # top-level's parent is itself
 | 
						|
            if current_section.parent is current_section:
 | 
						|
                # reached top level, time to give up
 | 
						|
                break
 | 
						|
            current_section = current_section.parent
 | 
						|
 | 
						|
        # restore interpolation to previous value before returning
 | 
						|
        self.section.main.interpolation = save_interp
 | 
						|
        if val is None:
 | 
						|
            raise MissingInterpolationOption(key)
 | 
						|
        return val, current_section
 | 
						|
 | 
						|
 | 
						|
    def _parse_match(self, match):
 | 
						|
        """Implementation-dependent helper function.
 | 
						|
 | 
						|
        Will be passed a match object corresponding to the interpolation
 | 
						|
        key we just found (e.g., "%(foo)s" or "$foo"). Should look up that
 | 
						|
        key in the appropriate config file section (using the ``_fetch()``
 | 
						|
        helper function) and return a 3-tuple: (key, value, section)
 | 
						|
 | 
						|
        ``key`` is the name of the key we're looking for
 | 
						|
        ``value`` is the value found for that key
 | 
						|
        ``section`` is a reference to the section where it was found
 | 
						|
 | 
						|
        ``key`` and ``section`` should be None if no further
 | 
						|
        interpolation should be performed on the resulting value
 | 
						|
        (e.g., if we interpolated "$$" and returned "$").
 | 
						|
        """
 | 
						|
        raise NotImplementedError()
 | 
						|
    
 | 
						|
 | 
						|
 | 
						|
class ConfigParserInterpolation(InterpolationEngine):
 | 
						|
    """Behaves like ConfigParser."""
 | 
						|
    _cookie = '%'
 | 
						|
    _KEYCRE = re.compile(r"%\(([^)]*)\)s")
 | 
						|
 | 
						|
    def _parse_match(self, match):
 | 
						|
        key = match.group(1)
 | 
						|
        value, section = self._fetch(key)
 | 
						|
        return key, value, section
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class TemplateInterpolation(InterpolationEngine):
 | 
						|
    """Behaves like string.Template."""
 | 
						|
    _cookie = '$'
 | 
						|
    _delimiter = '$'
 | 
						|
    _KEYCRE = re.compile(r"""
 | 
						|
        \$(?:
 | 
						|
          (?P<escaped>\$)              |   # Two $ signs
 | 
						|
          (?P<named>[_a-z][_a-z0-9]*)  |   # $name format
 | 
						|
          {(?P<braced>[^}]*)}              # ${name} format
 | 
						|
        )
 | 
						|
        """, re.IGNORECASE | re.VERBOSE)
 | 
						|
 | 
						|
    def _parse_match(self, match):
 | 
						|
        # Valid name (in or out of braces): fetch value from section
 | 
						|
        key = match.group('named') or match.group('braced')
 | 
						|
        if key is not None:
 | 
						|
            value, section = self._fetch(key)
 | 
						|
            return key, value, section
 | 
						|
        # Escaped delimiter (e.g., $$): return single delimiter
 | 
						|
        if match.group('escaped') is not None:
 | 
						|
            # Return None for key and section to indicate it's time to stop
 | 
						|
            return None, self._delimiter, None
 | 
						|
        # Anything else: ignore completely, just return it unchanged
 | 
						|
        return None, match.group(), None
 | 
						|
 | 
						|
 | 
						|
interpolation_engines = {
 | 
						|
    'configparser': ConfigParserInterpolation,
 | 
						|
    'template': TemplateInterpolation,
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
def __newobj__(cls, *args):
 | 
						|
    # Hack for pickle
 | 
						|
    return cls.__new__(cls, *args) 
 | 
						|
 | 
						|
class Section(dict):
 | 
						|
    """
 | 
						|
    A dictionary-like object that represents a section in a config file.
 | 
						|
    
 | 
						|
    It does string interpolation if the 'interpolation' attribute
 | 
						|
    of the 'main' object is set to True.
 | 
						|
    
 | 
						|
    Interpolation is tried first from this object, then from the 'DEFAULT'
 | 
						|
    section of this object, next from the parent and its 'DEFAULT' section,
 | 
						|
    and so on until the main object is reached.
 | 
						|
    
 | 
						|
    A Section will behave like an ordered dictionary - following the
 | 
						|
    order of the ``scalars`` and ``sections`` attributes.
 | 
						|
    You can use this to change the order of members.
 | 
						|
    
 | 
						|
    Iteration follows the order: scalars, then sections.
 | 
						|
    """
 | 
						|
 | 
						|
    
 | 
						|
    def __setstate__(self, state):
 | 
						|
        dict.update(self, state[0])
 | 
						|
        self.__dict__.update(state[1])
 | 
						|
 | 
						|
    def __reduce__(self):
 | 
						|
        state = (dict(self), self.__dict__)
 | 
						|
        return (__newobj__, (self.__class__,), state)
 | 
						|
    
 | 
						|
    
 | 
						|
    def __init__(self, parent, depth, main, indict=None, name=None):
 | 
						|
        """
 | 
						|
        * parent is the section above
 | 
						|
        * depth is the depth level of this section
 | 
						|
        * main is the main ConfigObj
 | 
						|
        * indict is a dictionary to initialise the section with
 | 
						|
        """
 | 
						|
        if indict is None:
 | 
						|
            indict = {}
 | 
						|
        dict.__init__(self)
 | 
						|
        # used for nesting level *and* interpolation
 | 
						|
        self.parent = parent
 | 
						|
        # used for the interpolation attribute
 | 
						|
        self.main = main
 | 
						|
        # level of nesting depth of this Section
 | 
						|
        self.depth = depth
 | 
						|
        # purely for information
 | 
						|
        self.name = name
 | 
						|
        #
 | 
						|
        self._initialise()
 | 
						|
        # we do this explicitly so that __setitem__ is used properly
 | 
						|
        # (rather than just passing to ``dict.__init__``)
 | 
						|
        for entry, value in indict.iteritems():
 | 
						|
            self[entry] = value
 | 
						|
            
 | 
						|
            
 | 
						|
    def _initialise(self):
 | 
						|
        # the sequence of scalar values in this Section
 | 
						|
        self.scalars = []
 | 
						|
        # the sequence of sections in this Section
 | 
						|
        self.sections = []
 | 
						|
        # for comments :-)
 | 
						|
        self.comments = {}
 | 
						|
        self.inline_comments = {}
 | 
						|
        # the configspec
 | 
						|
        self.configspec = None
 | 
						|
        # for defaults
 | 
						|
        self.defaults = []
 | 
						|
        self.default_values = {}
 | 
						|
        self.extra_values = []
 | 
						|
        self._created = False
 | 
						|
 | 
						|
 | 
						|
    def _interpolate(self, key, value):
 | 
						|
        try:
 | 
						|
            # do we already have an interpolation engine?
 | 
						|
            engine = self._interpolation_engine
 | 
						|
        except AttributeError:
 | 
						|
            # not yet: first time running _interpolate(), so pick the engine
 | 
						|
            name = self.main.interpolation
 | 
						|
            if name == True:  # note that "if name:" would be incorrect here
 | 
						|
                # backwards-compatibility: interpolation=True means use default
 | 
						|
                name = DEFAULT_INTERPOLATION
 | 
						|
            name = name.lower()  # so that "Template", "template", etc. all work
 | 
						|
            class_ = interpolation_engines.get(name, None)
 | 
						|
            if class_ is None:
 | 
						|
                # invalid value for self.main.interpolation
 | 
						|
                self.main.interpolation = False
 | 
						|
                return value
 | 
						|
            else:
 | 
						|
                # save reference to engine so we don't have to do this again
 | 
						|
                engine = self._interpolation_engine = class_(self)
 | 
						|
        # let the engine do the actual work
 | 
						|
        return engine.interpolate(key, value)
 | 
						|
 | 
						|
 | 
						|
    def __getitem__(self, key):
 | 
						|
        """Fetch the item and do string interpolation."""
 | 
						|
        val = dict.__getitem__(self, key)
 | 
						|
        if self.main.interpolation: 
 | 
						|
            if isinstance(val, basestring):
 | 
						|
                return self._interpolate(key, val)
 | 
						|
            if isinstance(val, list):
 | 
						|
                def _check(entry):
 | 
						|
                    if isinstance(entry, basestring):
 | 
						|
                        return self._interpolate(key, entry)
 | 
						|
                    return entry
 | 
						|
                new = [_check(entry) for entry in val]
 | 
						|
                if new != val:
 | 
						|
                    return new
 | 
						|
        return val
 | 
						|
 | 
						|
 | 
						|
    def __setitem__(self, key, value, unrepr=False):
 | 
						|
        """
 | 
						|
        Correctly set a value.
 | 
						|
        
 | 
						|
        Making dictionary values Section instances.
 | 
						|
        (We have to special case 'Section' instances - which are also dicts)
 | 
						|
        
 | 
						|
        Keys must be strings.
 | 
						|
        Values need only be strings (or lists of strings) if
 | 
						|
        ``main.stringify`` is set.
 | 
						|
        
 | 
						|
        ``unrepr`` must be set when setting a value to a dictionary, without
 | 
						|
        creating a new sub-section.
 | 
						|
        """
 | 
						|
        if not isinstance(key, basestring):
 | 
						|
            raise ValueError('The key "%s" is not a string.' % key)
 | 
						|
        
 | 
						|
        # add the comment
 | 
						|
        if key not in self.comments:
 | 
						|
            self.comments[key] = []
 | 
						|
            self.inline_comments[key] = ''
 | 
						|
        # remove the entry from defaults
 | 
						|
        if key in self.defaults:
 | 
						|
            self.defaults.remove(key)
 | 
						|
        #
 | 
						|
        if isinstance(value, Section):
 | 
						|
            if key not in self:
 | 
						|
                self.sections.append(key)
 | 
						|
            dict.__setitem__(self, key, value)
 | 
						|
        elif isinstance(value, dict) and not unrepr:
 | 
						|
            # First create the new depth level,
 | 
						|
            # then create the section
 | 
						|
            if key not in self:
 | 
						|
                self.sections.append(key)
 | 
						|
            new_depth = self.depth + 1
 | 
						|
            dict.__setitem__(
 | 
						|
                self,
 | 
						|
                key,
 | 
						|
                Section(
 | 
						|
                    self,
 | 
						|
                    new_depth,
 | 
						|
                    self.main,
 | 
						|
                    indict=value,
 | 
						|
                    name=key))
 | 
						|
        else:
 | 
						|
            if key not in self:
 | 
						|
                self.scalars.append(key)
 | 
						|
            if not self.main.stringify:
 | 
						|
                if isinstance(value, basestring):
 | 
						|
                    pass
 | 
						|
                elif isinstance(value, (list, tuple)):
 | 
						|
                    for entry in value:
 | 
						|
                        if not isinstance(entry, basestring):
 | 
						|
                            raise TypeError('Value is not a string "%s".' % entry)
 | 
						|
                else:
 | 
						|
                    raise TypeError('Value is not a string "%s".' % value)
 | 
						|
            dict.__setitem__(self, key, value)
 | 
						|
 | 
						|
 | 
						|
    def __delitem__(self, key):
 | 
						|
        """Remove items from the sequence when deleting."""
 | 
						|
        dict. __delitem__(self, key)
 | 
						|
        if key in self.scalars:
 | 
						|
            self.scalars.remove(key)
 | 
						|
        else:
 | 
						|
            self.sections.remove(key)
 | 
						|
        del self.comments[key]
 | 
						|
        del self.inline_comments[key]
 | 
						|
 | 
						|
 | 
						|
    def get(self, key, default=None):
 | 
						|
        """A version of ``get`` that doesn't bypass string interpolation."""
 | 
						|
        try:
 | 
						|
            return self[key]
 | 
						|
        except KeyError:
 | 
						|
            return default
 | 
						|
 | 
						|
 | 
						|
    def update(self, indict):
 | 
						|
        """
 | 
						|
        A version of update that uses our ``__setitem__``.
 | 
						|
        """
 | 
						|
        for entry in indict:
 | 
						|
            self[entry] = indict[entry]
 | 
						|
 | 
						|
 | 
						|
    def pop(self, key, default=MISSING):
 | 
						|
        """
 | 
						|
        'D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
 | 
						|
        If key is not found, d is returned if given, otherwise KeyError is raised'
 | 
						|
        """
 | 
						|
        try:
 | 
						|
            val = self[key]
 | 
						|
        except KeyError:
 | 
						|
            if default is MISSING:
 | 
						|
                raise
 | 
						|
            val = default
 | 
						|
        else:
 | 
						|
            del self[key]
 | 
						|
        return val
 | 
						|
 | 
						|
 | 
						|
    def popitem(self):
 | 
						|
        """Pops the first (key,val)"""
 | 
						|
        sequence = (self.scalars + self.sections)
 | 
						|
        if not sequence:
 | 
						|
            raise KeyError(": 'popitem(): dictionary is empty'")
 | 
						|
        key = sequence[0]
 | 
						|
        val =  self[key]
 | 
						|
        del self[key]
 | 
						|
        return key, val
 | 
						|
 | 
						|
 | 
						|
    def clear(self):
 | 
						|
        """
 | 
						|
        A version of clear that also affects scalars/sections
 | 
						|
        Also clears comments and configspec.
 | 
						|
        
 | 
						|
        Leaves other attributes alone :
 | 
						|
            depth/main/parent are not affected
 | 
						|
        """
 | 
						|
        dict.clear(self)
 | 
						|
        self.scalars = []
 | 
						|
        self.sections = []
 | 
						|
        self.comments = {}
 | 
						|
        self.inline_comments = {}
 | 
						|
        self.configspec = None
 | 
						|
        self.defaults = []
 | 
						|
        self.extra_values = []
 | 
						|
 | 
						|
 | 
						|
    def setdefault(self, key, default=None):
 | 
						|
        """A version of setdefault that sets sequence if appropriate."""
 | 
						|
        try:
 | 
						|
            return self[key]
 | 
						|
        except KeyError:
 | 
						|
            self[key] = default
 | 
						|
            return self[key]
 | 
						|
 | 
						|
 | 
						|
    def items(self):
 | 
						|
        """D.items() -> list of D's (key, value) pairs, as 2-tuples"""
 | 
						|
        return zip((self.scalars + self.sections), self.values())
 | 
						|
 | 
						|
 | 
						|
    def keys(self):
 | 
						|
        """D.keys() -> list of D's keys"""
 | 
						|
        return (self.scalars + self.sections)
 | 
						|
 | 
						|
 | 
						|
    def values(self):
 | 
						|
        """D.values() -> list of D's values"""
 | 
						|
        return [self[key] for key in (self.scalars + self.sections)]
 | 
						|
 | 
						|
 | 
						|
    def iteritems(self):
 | 
						|
        """D.iteritems() -> an iterator over the (key, value) items of D"""
 | 
						|
        return iter(self.items())
 | 
						|
 | 
						|
 | 
						|
    def iterkeys(self):
 | 
						|
        """D.iterkeys() -> an iterator over the keys of D"""
 | 
						|
        return iter((self.scalars + self.sections))
 | 
						|
 | 
						|
    __iter__ = iterkeys
 | 
						|
 | 
						|
 | 
						|
    def itervalues(self):
 | 
						|
        """D.itervalues() -> an iterator over the values of D"""
 | 
						|
        return iter(self.values())
 | 
						|
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        """x.__repr__() <==> repr(x)"""
 | 
						|
        def _getval(key):
 | 
						|
            try:
 | 
						|
                return self[key]
 | 
						|
            except MissingInterpolationOption:
 | 
						|
                return dict.__getitem__(self, key)
 | 
						|
        return '{%s}' % ', '.join([('%s: %s' % (repr(key), repr(_getval(key))))
 | 
						|
            for key in (self.scalars + self.sections)])
 | 
						|
 | 
						|
    __str__ = __repr__
 | 
						|
    __str__.__doc__ = "x.__str__() <==> str(x)"
 | 
						|
 | 
						|
 | 
						|
    # Extra methods - not in a normal dictionary
 | 
						|
 | 
						|
    def dict(self):
 | 
						|
        """
 | 
						|
        Return a deepcopy of self as a dictionary.
 | 
						|
        
 | 
						|
        All members that are ``Section`` instances are recursively turned to
 | 
						|
        ordinary dictionaries - by calling their ``dict`` method.
 | 
						|
        
 | 
						|
        >>> n = a.dict()
 | 
						|
        >>> n == a
 | 
						|
        1
 | 
						|
        >>> n is a
 | 
						|
        0
 | 
						|
        """
 | 
						|
        newdict = {}
 | 
						|
        for entry in self:
 | 
						|
            this_entry = self[entry]
 | 
						|
            if isinstance(this_entry, Section):
 | 
						|
                this_entry = this_entry.dict()
 | 
						|
            elif isinstance(this_entry, list):
 | 
						|
                # create a copy rather than a reference
 | 
						|
                this_entry = list(this_entry)
 | 
						|
            elif isinstance(this_entry, tuple):
 | 
						|
                # create a copy rather than a reference
 | 
						|
                this_entry = tuple(this_entry)
 | 
						|
            newdict[entry] = this_entry
 | 
						|
        return newdict
 | 
						|
 | 
						|
 | 
						|
    def merge(self, indict):
 | 
						|
        """
 | 
						|
        A recursive update - useful for merging config files.
 | 
						|
        
 | 
						|
        >>> a = '''[section1]
 | 
						|
        ...     option1 = True
 | 
						|
        ...     [[subsection]]
 | 
						|
        ...     more_options = False
 | 
						|
        ...     # end of file'''.splitlines()
 | 
						|
        >>> b = '''# File is user.ini
 | 
						|
        ...     [section1]
 | 
						|
        ...     option1 = False
 | 
						|
        ...     # end of file'''.splitlines()
 | 
						|
        >>> c1 = ConfigObj(b)
 | 
						|
        >>> c2 = ConfigObj(a)
 | 
						|
        >>> c2.merge(c1)
 | 
						|
        >>> c2
 | 
						|
        ConfigObj({'section1': {'option1': 'False', 'subsection': {'more_options': 'False'}}})
 | 
						|
        """
 | 
						|
        for key, val in indict.items():
 | 
						|
            if (key in self and isinstance(self[key], dict) and
 | 
						|
                                isinstance(val, dict)):
 | 
						|
                self[key].merge(val)
 | 
						|
            else:   
 | 
						|
                self[key] = val
 | 
						|
 | 
						|
 | 
						|
    def rename(self, oldkey, newkey):
 | 
						|
        """
 | 
						|
        Change a keyname to another, without changing position in sequence.
 | 
						|
        
 | 
						|
        Implemented so that transformations can be made on keys,
 | 
						|
        as well as on values. (used by encode and decode)
 | 
						|
        
 | 
						|
        Also renames comments.
 | 
						|
        """
 | 
						|
        if oldkey in self.scalars:
 | 
						|
            the_list = self.scalars
 | 
						|
        elif oldkey in self.sections:
 | 
						|
            the_list = self.sections
 | 
						|
        else:
 | 
						|
            raise KeyError('Key "%s" not found.' % oldkey)
 | 
						|
        pos = the_list.index(oldkey)
 | 
						|
        #
 | 
						|
        val = self[oldkey]
 | 
						|
        dict.__delitem__(self, oldkey)
 | 
						|
        dict.__setitem__(self, newkey, val)
 | 
						|
        the_list.remove(oldkey)
 | 
						|
        the_list.insert(pos, newkey)
 | 
						|
        comm = self.comments[oldkey]
 | 
						|
        inline_comment = self.inline_comments[oldkey]
 | 
						|
        del self.comments[oldkey]
 | 
						|
        del self.inline_comments[oldkey]
 | 
						|
        self.comments[newkey] = comm
 | 
						|
        self.inline_comments[newkey] = inline_comment
 | 
						|
 | 
						|
 | 
						|
    def walk(self, function, raise_errors=True,
 | 
						|
            call_on_sections=False, **keywargs):
 | 
						|
        """
 | 
						|
        Walk every member and call a function on the keyword and value.
 | 
						|
        
 | 
						|
        Return a dictionary of the return values
 | 
						|
        
 | 
						|
        If the function raises an exception, raise the errror
 | 
						|
        unless ``raise_errors=False``, in which case set the return value to
 | 
						|
        ``False``.
 | 
						|
        
 | 
						|
        Any unrecognised keyword arguments you pass to walk, will be pased on
 | 
						|
        to the function you pass in.
 | 
						|
        
 | 
						|
        Note: if ``call_on_sections`` is ``True`` then - on encountering a
 | 
						|
        subsection, *first* the function is called for the *whole* subsection,
 | 
						|
        and then recurses into it's members. This means your function must be
 | 
						|
        able to handle strings, dictionaries and lists. This allows you
 | 
						|
        to change the key of subsections as well as for ordinary members. The
 | 
						|
        return value when called on the whole subsection has to be discarded.
 | 
						|
        
 | 
						|
        See  the encode and decode methods for examples, including functions.
 | 
						|
        
 | 
						|
        .. admonition:: caution
 | 
						|
        
 | 
						|
            You can use ``walk`` to transform the names of members of a section
 | 
						|
            but you mustn't add or delete members.
 | 
						|
        
 | 
						|
        >>> config = '''[XXXXsection]
 | 
						|
        ... XXXXkey = XXXXvalue'''.splitlines()
 | 
						|
        >>> cfg = ConfigObj(config)
 | 
						|
        >>> cfg
 | 
						|
        ConfigObj({'XXXXsection': {'XXXXkey': 'XXXXvalue'}})
 | 
						|
        >>> def transform(section, key):
 | 
						|
        ...     val = section[key]
 | 
						|
        ...     newkey = key.replace('XXXX', 'CLIENT1')
 | 
						|
        ...     section.rename(key, newkey)
 | 
						|
        ...     if isinstance(val, (tuple, list, dict)):
 | 
						|
        ...         pass
 | 
						|
        ...     else:
 | 
						|
        ...         val = val.replace('XXXX', 'CLIENT1')
 | 
						|
        ...         section[newkey] = val
 | 
						|
        >>> cfg.walk(transform, call_on_sections=True)
 | 
						|
        {'CLIENT1section': {'CLIENT1key': None}}
 | 
						|
        >>> cfg
 | 
						|
        ConfigObj({'CLIENT1section': {'CLIENT1key': 'CLIENT1value'}})
 | 
						|
        """
 | 
						|
        out = {}
 | 
						|
        # scalars first
 | 
						|
        for i in range(len(self.scalars)):
 | 
						|
            entry = self.scalars[i]
 | 
						|
            try:
 | 
						|
                val = function(self, entry, **keywargs)
 | 
						|
                # bound again in case name has changed
 | 
						|
                entry = self.scalars[i]
 | 
						|
                out[entry] = val
 | 
						|
            except Exception:
 | 
						|
                if raise_errors:
 | 
						|
                    raise
 | 
						|
                else:
 | 
						|
                    entry = self.scalars[i]
 | 
						|
                    out[entry] = False
 | 
						|
        # then sections
 | 
						|
        for i in range(len(self.sections)):
 | 
						|
            entry = self.sections[i]
 | 
						|
            if call_on_sections:
 | 
						|
                try:
 | 
						|
                    function(self, entry, **keywargs)
 | 
						|
                except Exception:
 | 
						|
                    if raise_errors:
 | 
						|
                        raise
 | 
						|
                    else:
 | 
						|
                        entry = self.sections[i]
 | 
						|
                        out[entry] = False
 | 
						|
                # bound again in case name has changed
 | 
						|
                entry = self.sections[i]
 | 
						|
            # previous result is discarded
 | 
						|
            out[entry] = self[entry].walk(
 | 
						|
                function,
 | 
						|
                raise_errors=raise_errors,
 | 
						|
                call_on_sections=call_on_sections,
 | 
						|
                **keywargs)
 | 
						|
        return out
 | 
						|
 | 
						|
 | 
						|
    def as_bool(self, key):
 | 
						|
        """
 | 
						|
        Accepts a key as input. The corresponding value must be a string or
 | 
						|
        the objects (``True`` or 1) or (``False`` or 0). We allow 0 and 1 to
 | 
						|
        retain compatibility with Python 2.2.
 | 
						|
        
 | 
						|
        If the string is one of  ``True``, ``On``, ``Yes``, or ``1`` it returns 
 | 
						|
        ``True``.
 | 
						|
        
 | 
						|
        If the string is one of  ``False``, ``Off``, ``No``, or ``0`` it returns 
 | 
						|
        ``False``.
 | 
						|
        
 | 
						|
        ``as_bool`` is not case sensitive.
 | 
						|
        
 | 
						|
        Any other input will raise a ``ValueError``.
 | 
						|
        
 | 
						|
        >>> a = ConfigObj()
 | 
						|
        >>> a['a'] = 'fish'
 | 
						|
        >>> a.as_bool('a')
 | 
						|
        Traceback (most recent call last):
 | 
						|
        ValueError: Value "fish" is neither True nor False
 | 
						|
        >>> a['b'] = 'True'
 | 
						|
        >>> a.as_bool('b')
 | 
						|
        1
 | 
						|
        >>> a['b'] = 'off'
 | 
						|
        >>> a.as_bool('b')
 | 
						|
        0
 | 
						|
        """
 | 
						|
        val = self[key]
 | 
						|
        if val == True:
 | 
						|
            return True
 | 
						|
        elif val == False:
 | 
						|
            return False
 | 
						|
        else:
 | 
						|
            try:
 | 
						|
                if not isinstance(val, basestring):
 | 
						|
                    # TODO: Why do we raise a KeyError here?
 | 
						|
                    raise KeyError()
 | 
						|
                else:
 | 
						|
                    return self.main._bools[val.lower()]
 | 
						|
            except KeyError:
 | 
						|
                raise ValueError('Value "%s" is neither True nor False' % val)
 | 
						|
 | 
						|
 | 
						|
    def as_int(self, key):
 | 
						|
        """
 | 
						|
        A convenience method which coerces the specified value to an integer.
 | 
						|
        
 | 
						|
        If the value is an invalid literal for ``int``, a ``ValueError`` will
 | 
						|
        be raised.
 | 
						|
        
 | 
						|
        >>> a = ConfigObj()
 | 
						|
        >>> a['a'] = 'fish'
 | 
						|
        >>> a.as_int('a')
 | 
						|
        Traceback (most recent call last):
 | 
						|
        ValueError: invalid literal for int() with base 10: 'fish'
 | 
						|
        >>> a['b'] = '1'
 | 
						|
        >>> a.as_int('b')
 | 
						|
        1
 | 
						|
        >>> a['b'] = '3.2'
 | 
						|
        >>> a.as_int('b')
 | 
						|
        Traceback (most recent call last):
 | 
						|
        ValueError: invalid literal for int() with base 10: '3.2'
 | 
						|
        """
 | 
						|
        return int(self[key])
 | 
						|
 | 
						|
 | 
						|
    def as_float(self, key):
 | 
						|
        """
 | 
						|
        A convenience method which coerces the specified value to a float.
 | 
						|
        
 | 
						|
        If the value is an invalid literal for ``float``, a ``ValueError`` will
 | 
						|
        be raised.
 | 
						|
        
 | 
						|
        >>> a = ConfigObj()
 | 
						|
        >>> a['a'] = 'fish'
 | 
						|
        >>> a.as_float('a')
 | 
						|
        Traceback (most recent call last):
 | 
						|
        ValueError: invalid literal for float(): fish
 | 
						|
        >>> a['b'] = '1'
 | 
						|
        >>> a.as_float('b')
 | 
						|
        1.0
 | 
						|
        >>> a['b'] = '3.2'
 | 
						|
        >>> a.as_float('b')
 | 
						|
        3.2000000000000002
 | 
						|
        """
 | 
						|
        return float(self[key])
 | 
						|
    
 | 
						|
    
 | 
						|
    def as_list(self, key):
 | 
						|
        """
 | 
						|
        A convenience method which fetches the specified value, guaranteeing
 | 
						|
        that it is a list.
 | 
						|
        
 | 
						|
        >>> a = ConfigObj()
 | 
						|
        >>> a['a'] = 1
 | 
						|
        >>> a.as_list('a')
 | 
						|
        [1]
 | 
						|
        >>> a['a'] = (1,)
 | 
						|
        >>> a.as_list('a')
 | 
						|
        [1]
 | 
						|
        >>> a['a'] = [1]
 | 
						|
        >>> a.as_list('a')
 | 
						|
        [1]
 | 
						|
        """
 | 
						|
        result = self[key]
 | 
						|
        if isinstance(result, (tuple, list)):
 | 
						|
            return list(result)
 | 
						|
        return [result]
 | 
						|
        
 | 
						|
 | 
						|
    def restore_default(self, key):
 | 
						|
        """
 | 
						|
        Restore (and return) default value for the specified key.
 | 
						|
        
 | 
						|
        This method will only work for a ConfigObj that was created
 | 
						|
        with a configspec and has been validated.
 | 
						|
        
 | 
						|
        If there is no default value for this key, ``KeyError`` is raised.
 | 
						|
        """
 | 
						|
        default = self.default_values[key]
 | 
						|
        dict.__setitem__(self, key, default)
 | 
						|
        if key not in self.defaults:
 | 
						|
            self.defaults.append(key)
 | 
						|
        return default
 | 
						|
 | 
						|
    
 | 
						|
    def restore_defaults(self):
 | 
						|
        """
 | 
						|
        Recursively restore default values to all members
 | 
						|
        that have them.
 | 
						|
        
 | 
						|
        This method will only work for a ConfigObj that was created
 | 
						|
        with a configspec and has been validated.
 | 
						|
        
 | 
						|
        It doesn't delete or modify entries without default values.
 | 
						|
        """
 | 
						|
        for key in self.default_values:
 | 
						|
            self.restore_default(key)
 | 
						|
            
 | 
						|
        for section in self.sections:
 | 
						|
            self[section].restore_defaults()
 | 
						|
 | 
						|
 | 
						|
class ConfigObj(Section):
 | 
						|
    """An object to read, create, and write config files."""
 | 
						|
 | 
						|
    _keyword = re.compile(r'''^ # line start
 | 
						|
        (\s*)                   # indentation
 | 
						|
        (                       # keyword
 | 
						|
            (?:".*?")|          # double quotes
 | 
						|
            (?:'.*?')|          # single quotes
 | 
						|
            (?:[^'"=].*?)       # no quotes
 | 
						|
        )
 | 
						|
        \s*=\s*                 # divider
 | 
						|
        (.*)                    # value (including list values and comments)
 | 
						|
        $   # line end
 | 
						|
        ''',
 | 
						|
        re.VERBOSE)
 | 
						|
 | 
						|
    _sectionmarker = re.compile(r'''^
 | 
						|
        (\s*)                     # 1: indentation
 | 
						|
        ((?:\[\s*)+)              # 2: section marker open
 | 
						|
        (                         # 3: section name open
 | 
						|
            (?:"\s*\S.*?\s*")|    # at least one non-space with double quotes
 | 
						|
            (?:'\s*\S.*?\s*')|    # at least one non-space with single quotes
 | 
						|
            (?:[^'"\s].*?)        # at least one non-space unquoted
 | 
						|
        )                         # section name close
 | 
						|
        ((?:\s*\])+)              # 4: section marker close
 | 
						|
        \s*(\#.*)?                # 5: optional comment
 | 
						|
        $''',
 | 
						|
        re.VERBOSE)
 | 
						|
 | 
						|
    # this regexp pulls list values out as a single string
 | 
						|
    # or single values and comments
 | 
						|
    # FIXME: this regex adds a '' to the end of comma terminated lists
 | 
						|
    #   workaround in ``_handle_value``
 | 
						|
    _valueexp = re.compile(r'''^
 | 
						|
        (?:
 | 
						|
            (?:
 | 
						|
                (
 | 
						|
                    (?:
 | 
						|
                        (?:
 | 
						|
                            (?:".*?")|              # double quotes
 | 
						|
                            (?:'.*?')|              # single quotes
 | 
						|
                            (?:[^'",\#][^,\#]*?)    # unquoted
 | 
						|
                        )
 | 
						|
                        \s*,\s*                     # comma
 | 
						|
                    )*      # match all list items ending in a comma (if any)
 | 
						|
                )
 | 
						|
                (
 | 
						|
                    (?:".*?")|                      # double quotes
 | 
						|
                    (?:'.*?')|                      # single quotes
 | 
						|
                    (?:[^'",\#\s][^,]*?)|           # unquoted
 | 
						|
                    (?:(?<!,))                      # Empty value
 | 
						|
                )?          # last item in a list - or string value
 | 
						|
            )|
 | 
						|
            (,)             # alternatively a single comma - empty list
 | 
						|
        )
 | 
						|
        \s*(\#.*)?          # optional comment
 | 
						|
        $''',
 | 
						|
        re.VERBOSE)
 | 
						|
 | 
						|
    # use findall to get the members of a list value
 | 
						|
    _listvalueexp = re.compile(r'''
 | 
						|
        (
 | 
						|
            (?:".*?")|          # double quotes
 | 
						|
            (?:'.*?')|          # single quotes
 | 
						|
            (?:[^'",\#]?.*?)       # unquoted
 | 
						|
        )
 | 
						|
        \s*,\s*                 # comma
 | 
						|
        ''',
 | 
						|
        re.VERBOSE)
 | 
						|
 | 
						|
    # this regexp is used for the value
 | 
						|
    # when lists are switched off
 | 
						|
    _nolistvalue = re.compile(r'''^
 | 
						|
        (
 | 
						|
            (?:".*?")|          # double quotes
 | 
						|
            (?:'.*?')|          # single quotes
 | 
						|
            (?:[^'"\#].*?)|     # unquoted
 | 
						|
            (?:)                # Empty value
 | 
						|
        )
 | 
						|
        \s*(\#.*)?              # optional comment
 | 
						|
        $''',
 | 
						|
        re.VERBOSE)
 | 
						|
 | 
						|
    # regexes for finding triple quoted values on one line
 | 
						|
    _single_line_single = re.compile(r"^'''(.*?)'''\s*(#.*)?$")
 | 
						|
    _single_line_double = re.compile(r'^"""(.*?)"""\s*(#.*)?$')
 | 
						|
    _multi_line_single = re.compile(r"^(.*?)'''\s*(#.*)?$")
 | 
						|
    _multi_line_double = re.compile(r'^(.*?)"""\s*(#.*)?$')
 | 
						|
 | 
						|
    _triple_quote = {
 | 
						|
        "'''": (_single_line_single, _multi_line_single),
 | 
						|
        '"""': (_single_line_double, _multi_line_double),
 | 
						|
    }
 | 
						|
 | 
						|
    # Used by the ``istrue`` Section method
 | 
						|
    _bools = {
 | 
						|
        'yes': True, 'no': False,
 | 
						|
        'on': True, 'off': False,
 | 
						|
        '1': True, '0': False,
 | 
						|
        'true': True, 'false': False,
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
    def __init__(self, infile=None, options=None, configspec=None, encoding=None,
 | 
						|
                 interpolation=True, raise_errors=False, list_values=True,
 | 
						|
                 create_empty=False, file_error=False, stringify=True,
 | 
						|
                 indent_type=None, default_encoding=None, unrepr=False,
 | 
						|
                 write_empty_values=False, _inspec=False):
 | 
						|
        """
 | 
						|
        Parse a config file or create a config file object.
 | 
						|
        
 | 
						|
        ``ConfigObj(infile=None, configspec=None, encoding=None,
 | 
						|
                    interpolation=True, raise_errors=False, list_values=True,
 | 
						|
                    create_empty=False, file_error=False, stringify=True,
 | 
						|
                    indent_type=None, default_encoding=None, unrepr=False,
 | 
						|
                    write_empty_values=False, _inspec=False)``
 | 
						|
        """
 | 
						|
        self._inspec = _inspec
 | 
						|
        # init the superclass
 | 
						|
        Section.__init__(self, self, 0, self)
 | 
						|
        
 | 
						|
        infile = infile or []
 | 
						|
        
 | 
						|
        _options = {'configspec': configspec,
 | 
						|
                    'encoding': encoding, 'interpolation': interpolation,
 | 
						|
                    'raise_errors': raise_errors, 'list_values': list_values,
 | 
						|
                    'create_empty': create_empty, 'file_error': file_error,
 | 
						|
                    'stringify': stringify, 'indent_type': indent_type,
 | 
						|
                    'default_encoding': default_encoding, 'unrepr': unrepr,
 | 
						|
                    'write_empty_values': write_empty_values}
 | 
						|
 | 
						|
        if options is None:
 | 
						|
            options = _options
 | 
						|
        else:
 | 
						|
            import warnings
 | 
						|
            warnings.warn('Passing in an options dictionary to ConfigObj() is '
 | 
						|
                          'deprecated. Use **options instead.',
 | 
						|
                          DeprecationWarning, stacklevel=2)
 | 
						|
            
 | 
						|
            # TODO: check the values too.
 | 
						|
            for entry in options:
 | 
						|
                if entry not in OPTION_DEFAULTS:
 | 
						|
                    raise TypeError('Unrecognised option "%s".' % entry)
 | 
						|
            for entry, value in OPTION_DEFAULTS.items():
 | 
						|
                if entry not in options:
 | 
						|
                    options[entry] = value
 | 
						|
                keyword_value = _options[entry]
 | 
						|
                if value != keyword_value:
 | 
						|
                    options[entry] = keyword_value
 | 
						|
        
 | 
						|
        # XXXX this ignores an explicit list_values = True in combination
 | 
						|
        # with _inspec. The user should *never* do that anyway, but still...
 | 
						|
        if _inspec:
 | 
						|
            options['list_values'] = False
 | 
						|
        
 | 
						|
        self._initialise(options)
 | 
						|
        configspec = options['configspec']
 | 
						|
        self._original_configspec = configspec
 | 
						|
        self._load(infile, configspec)
 | 
						|
        
 | 
						|
        
 | 
						|
    def _load(self, infile, configspec):
 | 
						|
        if isinstance(infile, basestring):
 | 
						|
            self.filename = infile
 | 
						|
            if os.path.isfile(infile):
 | 
						|
                h = open(infile, 'rb')
 | 
						|
                infile = h.read() or []
 | 
						|
                h.close()
 | 
						|
            elif self.file_error:
 | 
						|
                # raise an error if the file doesn't exist
 | 
						|
                raise IOError('Config file not found: "%s".' % self.filename)
 | 
						|
            else:
 | 
						|
                # file doesn't already exist
 | 
						|
                if self.create_empty:
 | 
						|
                    # this is a good test that the filename specified
 | 
						|
                    # isn't impossible - like on a non-existent device
 | 
						|
                    h = open(infile, 'w')
 | 
						|
                    h.write('')
 | 
						|
                    h.close()
 | 
						|
                infile = []
 | 
						|
                
 | 
						|
        elif isinstance(infile, (list, tuple)):
 | 
						|
            infile = list(infile)
 | 
						|
            
 | 
						|
        elif isinstance(infile, dict):
 | 
						|
            # initialise self
 | 
						|
            # the Section class handles creating subsections
 | 
						|
            if isinstance(infile, ConfigObj):
 | 
						|
                # get a copy of our ConfigObj
 | 
						|
                def set_section(in_section, this_section):
 | 
						|
                    for entry in in_section.scalars:
 | 
						|
                        this_section[entry] = in_section[entry]
 | 
						|
                    for section in in_section.sections:
 | 
						|
                        this_section[section] = {}
 | 
						|
                        set_section(in_section[section], this_section[section])
 | 
						|
                set_section(infile, self)
 | 
						|
                
 | 
						|
            else:
 | 
						|
                for entry in infile:
 | 
						|
                    self[entry] = infile[entry]
 | 
						|
            del self._errors
 | 
						|
            
 | 
						|
            if configspec is not None:
 | 
						|
                self._handle_configspec(configspec)
 | 
						|
            else:
 | 
						|
                self.configspec = None
 | 
						|
            return
 | 
						|
        
 | 
						|
        elif getattr(infile, 'read', MISSING) is not MISSING:
 | 
						|
            # This supports file like objects
 | 
						|
            infile = infile.read() or []
 | 
						|
            # needs splitting into lines - but needs doing *after* decoding
 | 
						|
            # in case it's not an 8 bit encoding
 | 
						|
        else:
 | 
						|
            raise TypeError('infile must be a filename, file like object, or list of lines.')
 | 
						|
        
 | 
						|
        if infile:
 | 
						|
            # don't do it for the empty ConfigObj
 | 
						|
            infile = self._handle_bom(infile)
 | 
						|
            # infile is now *always* a list
 | 
						|
            #
 | 
						|
            # Set the newlines attribute (first line ending it finds)
 | 
						|
            # and strip trailing '\n' or '\r' from lines
 | 
						|
            for line in infile:
 | 
						|
                if (not line) or (line[-1] not in ('\r', '\n', '\r\n')):
 | 
						|
                    continue
 | 
						|
                for end in ('\r\n', '\n', '\r'):
 | 
						|
                    if line.endswith(end):
 | 
						|
                        self.newlines = end
 | 
						|
                        break
 | 
						|
                break
 | 
						|
 | 
						|
            infile = [line.rstrip('\r\n') for line in infile]
 | 
						|
            
 | 
						|
        self._parse(infile)
 | 
						|
        # if we had any errors, now is the time to raise them
 | 
						|
        if self._errors:
 | 
						|
            info = "at line %s." % self._errors[0].line_number
 | 
						|
            if len(self._errors) > 1:
 | 
						|
                msg = "Parsing failed with several errors.\nFirst error %s" % info
 | 
						|
                error = ConfigObjError(msg)
 | 
						|
            else:
 | 
						|
                error = self._errors[0]
 | 
						|
            # set the errors attribute; it's a list of tuples:
 | 
						|
            # (error_type, message, line_number)
 | 
						|
            error.errors = self._errors
 | 
						|
            # set the config attribute
 | 
						|
            error.config = self
 | 
						|
            raise error
 | 
						|
        # delete private attributes
 | 
						|
        del self._errors
 | 
						|
        
 | 
						|
        if configspec is None:
 | 
						|
            self.configspec = None
 | 
						|
        else:
 | 
						|
            self._handle_configspec(configspec)
 | 
						|
    
 | 
						|
    
 | 
						|
    def _initialise(self, options=None):
 | 
						|
        if options is None:
 | 
						|
            options = OPTION_DEFAULTS
 | 
						|
            
 | 
						|
        # initialise a few variables
 | 
						|
        self.filename = None
 | 
						|
        self._errors = []
 | 
						|
        self.raise_errors = options['raise_errors']
 | 
						|
        self.interpolation = options['interpolation']
 | 
						|
        self.list_values = options['list_values']
 | 
						|
        self.create_empty = options['create_empty']
 | 
						|
        self.file_error = options['file_error']
 | 
						|
        self.stringify = options['stringify']
 | 
						|
        self.indent_type = options['indent_type']
 | 
						|
        self.encoding = options['encoding']
 | 
						|
        self.default_encoding = options['default_encoding']
 | 
						|
        self.BOM = False
 | 
						|
        self.newlines = None
 | 
						|
        self.write_empty_values = options['write_empty_values']
 | 
						|
        self.unrepr = options['unrepr']
 | 
						|
        
 | 
						|
        self.initial_comment = []
 | 
						|
        self.final_comment = []
 | 
						|
        self.configspec = None
 | 
						|
        
 | 
						|
        if self._inspec:
 | 
						|
            self.list_values = False
 | 
						|
        
 | 
						|
        # Clear section attributes as well
 | 
						|
        Section._initialise(self)
 | 
						|
        
 | 
						|
        
 | 
						|
    def __repr__(self):
 | 
						|
        def _getval(key):
 | 
						|
            try:
 | 
						|
                return self[key]
 | 
						|
            except MissingInterpolationOption:
 | 
						|
                return dict.__getitem__(self, key)
 | 
						|
        return ('ConfigObj({%s})' % 
 | 
						|
                ', '.join([('%s: %s' % (repr(key), repr(_getval(key)))) 
 | 
						|
                for key in (self.scalars + self.sections)]))
 | 
						|
    
 | 
						|
    
 | 
						|
    def _handle_bom(self, infile):
 | 
						|
        """
 | 
						|
        Handle any BOM, and decode if necessary.
 | 
						|
        
 | 
						|
        If an encoding is specified, that *must* be used - but the BOM should
 | 
						|
        still be removed (and the BOM attribute set).
 | 
						|
        
 | 
						|
        (If the encoding is wrongly specified, then a BOM for an alternative
 | 
						|
        encoding won't be discovered or removed.)
 | 
						|
        
 | 
						|
        If an encoding is not specified, UTF8 or UTF16 BOM will be detected and
 | 
						|
        removed. The BOM attribute will be set. UTF16 will be decoded to
 | 
						|
        unicode.
 | 
						|
        
 | 
						|
        NOTE: This method must not be called with an empty ``infile``.
 | 
						|
        
 | 
						|
        Specifying the *wrong* encoding is likely to cause a
 | 
						|
        ``UnicodeDecodeError``.
 | 
						|
        
 | 
						|
        ``infile`` must always be returned as a list of lines, but may be
 | 
						|
        passed in as a single string.
 | 
						|
        """
 | 
						|
        if ((self.encoding is not None) and
 | 
						|
            (self.encoding.lower() not in BOM_LIST)):
 | 
						|
            # No need to check for a BOM
 | 
						|
            # the encoding specified doesn't have one
 | 
						|
            # just decode
 | 
						|
            return self._decode(infile, self.encoding)
 | 
						|
        
 | 
						|
        if isinstance(infile, (list, tuple)):
 | 
						|
            line = infile[0]
 | 
						|
        else:
 | 
						|
            line = infile
 | 
						|
        if self.encoding is not None:
 | 
						|
            # encoding explicitly supplied
 | 
						|
            # And it could have an associated BOM
 | 
						|
            # TODO: if encoding is just UTF16 - we ought to check for both
 | 
						|
            # TODO: big endian and little endian versions.
 | 
						|
            enc = BOM_LIST[self.encoding.lower()]
 | 
						|
            if enc == 'utf_16':
 | 
						|
                # For UTF16 we try big endian and little endian
 | 
						|
                for BOM, (encoding, final_encoding) in BOMS.items():
 | 
						|
                    if not final_encoding:
 | 
						|
                        # skip UTF8
 | 
						|
                        continue
 | 
						|
                    if infile.startswith(BOM):
 | 
						|
                        ### BOM discovered
 | 
						|
                        ##self.BOM = True
 | 
						|
                        # Don't need to remove BOM
 | 
						|
                        return self._decode(infile, encoding)
 | 
						|
                    
 | 
						|
                # If we get this far, will *probably* raise a DecodeError
 | 
						|
                # As it doesn't appear to start with a BOM
 | 
						|
                return self._decode(infile, self.encoding)
 | 
						|
            
 | 
						|
            # Must be UTF8
 | 
						|
            BOM = BOM_SET[enc]
 | 
						|
            if not line.startswith(BOM):
 | 
						|
                return self._decode(infile, self.encoding)
 | 
						|
            
 | 
						|
            newline = line[len(BOM):]
 | 
						|
            
 | 
						|
            # BOM removed
 | 
						|
            if isinstance(infile, (list, tuple)):
 | 
						|
                infile[0] = newline
 | 
						|
            else:
 | 
						|
                infile = newline
 | 
						|
            self.BOM = True
 | 
						|
            return self._decode(infile, self.encoding)
 | 
						|
        
 | 
						|
        # No encoding specified - so we need to check for UTF8/UTF16
 | 
						|
        for BOM, (encoding, final_encoding) in BOMS.items():
 | 
						|
            if not line.startswith(BOM):
 | 
						|
                continue
 | 
						|
            else:
 | 
						|
                # BOM discovered
 | 
						|
                self.encoding = final_encoding
 | 
						|
                if not final_encoding:
 | 
						|
                    self.BOM = True
 | 
						|
                    # UTF8
 | 
						|
                    # remove BOM
 | 
						|
                    newline = line[len(BOM):]
 | 
						|
                    if isinstance(infile, (list, tuple)):
 | 
						|
                        infile[0] = newline
 | 
						|
                    else:
 | 
						|
                        infile = newline
 | 
						|
                    # UTF8 - don't decode
 | 
						|
                    if isinstance(infile, basestring):
 | 
						|
                        return infile.splitlines(True)
 | 
						|
                    else:
 | 
						|
                        return infile
 | 
						|
                # UTF16 - have to decode
 | 
						|
                return self._decode(infile, encoding)
 | 
						|
            
 | 
						|
        # No BOM discovered and no encoding specified, just return
 | 
						|
        if isinstance(infile, basestring):
 | 
						|
            # infile read from a file will be a single string
 | 
						|
            return infile.splitlines(True)
 | 
						|
        return infile
 | 
						|
 | 
						|
 | 
						|
    def _a_to_u(self, aString):
 | 
						|
        """Decode ASCII strings to unicode if a self.encoding is specified."""
 | 
						|
        if self.encoding:
 | 
						|
            return aString.decode('ascii')
 | 
						|
        else:
 | 
						|
            return aString
 | 
						|
 | 
						|
 | 
						|
    def _decode(self, infile, encoding):
 | 
						|
        """
 | 
						|
        Decode infile to unicode. Using the specified encoding.
 | 
						|
        
 | 
						|
        if is a string, it also needs converting to a list.
 | 
						|
        """
 | 
						|
        if isinstance(infile, basestring):
 | 
						|
            # can't be unicode
 | 
						|
            # NOTE: Could raise a ``UnicodeDecodeError``
 | 
						|
            return infile.decode(encoding).splitlines(True)
 | 
						|
        for i, line in enumerate(infile):
 | 
						|
            if not isinstance(line, unicode):
 | 
						|
                # NOTE: The isinstance test here handles mixed lists of unicode/string
 | 
						|
                # NOTE: But the decode will break on any non-string values
 | 
						|
                # NOTE: Or could raise a ``UnicodeDecodeError``
 | 
						|
                infile[i] = line.decode(encoding)
 | 
						|
        return infile
 | 
						|
 | 
						|
 | 
						|
    def _decode_element(self, line):
 | 
						|
        """Decode element to unicode if necessary."""
 | 
						|
        if not self.encoding:
 | 
						|
            return line
 | 
						|
        if isinstance(line, str) and self.default_encoding:
 | 
						|
            return line.decode(self.default_encoding)
 | 
						|
        return line
 | 
						|
 | 
						|
 | 
						|
    def _str(self, value):
 | 
						|
        """
 | 
						|
        Used by ``stringify`` within validate, to turn non-string values
 | 
						|
        into strings.
 | 
						|
        """
 | 
						|
        if not isinstance(value, basestring):
 | 
						|
            return str(value)
 | 
						|
        else:
 | 
						|
            return value
 | 
						|
 | 
						|
 | 
						|
    def _parse(self, infile):
 | 
						|
        """Actually parse the config file."""
 | 
						|
        temp_list_values = self.list_values
 | 
						|
        if self.unrepr:
 | 
						|
            self.list_values = False
 | 
						|
            
 | 
						|
        comment_list = []
 | 
						|
        done_start = False
 | 
						|
        this_section = self
 | 
						|
        maxline = len(infile) - 1
 | 
						|
        cur_index = -1
 | 
						|
        reset_comment = False
 | 
						|
        
 | 
						|
        while cur_index < maxline:
 | 
						|
            if reset_comment:
 | 
						|
                comment_list = []
 | 
						|
            cur_index += 1
 | 
						|
            line = infile[cur_index]
 | 
						|
            sline = line.strip()
 | 
						|
            # do we have anything on the line ?
 | 
						|
            if not sline or sline.startswith('#'):
 | 
						|
                reset_comment = False
 | 
						|
                comment_list.append(line)
 | 
						|
                continue
 | 
						|
            
 | 
						|
            if not done_start:
 | 
						|
                # preserve initial comment
 | 
						|
                self.initial_comment = comment_list
 | 
						|
                comment_list = []
 | 
						|
                done_start = True
 | 
						|
                
 | 
						|
            reset_comment = True
 | 
						|
            # first we check if it's a section marker
 | 
						|
            mat = self._sectionmarker.match(line)
 | 
						|
            if mat is not None:
 | 
						|
                # is a section line
 | 
						|
                (indent, sect_open, sect_name, sect_close, comment) = mat.groups()
 | 
						|
                if indent and (self.indent_type is None):
 | 
						|
                    self.indent_type = indent
 | 
						|
                cur_depth = sect_open.count('[')
 | 
						|
                if cur_depth != sect_close.count(']'):
 | 
						|
                    self._handle_error("Cannot compute the section depth at line %s.",
 | 
						|
                                       NestingError, infile, cur_index)
 | 
						|
                    continue
 | 
						|
                
 | 
						|
                if cur_depth < this_section.depth:
 | 
						|
                    # the new section is dropping back to a previous level
 | 
						|
                    try:
 | 
						|
                        parent = self._match_depth(this_section,
 | 
						|
                                                   cur_depth).parent
 | 
						|
                    except SyntaxError:
 | 
						|
                        self._handle_error("Cannot compute nesting level at line %s.",
 | 
						|
                                           NestingError, infile, cur_index)
 | 
						|
                        continue
 | 
						|
                elif cur_depth == this_section.depth:
 | 
						|
                    # the new section is a sibling of the current section
 | 
						|
                    parent = this_section.parent
 | 
						|
                elif cur_depth == this_section.depth + 1:
 | 
						|
                    # the new section is a child the current section
 | 
						|
                    parent = this_section
 | 
						|
                else:
 | 
						|
                    self._handle_error("Section too nested at line %s.",
 | 
						|
                                       NestingError, infile, cur_index)
 | 
						|
                    
 | 
						|
                sect_name = self._unquote(sect_name)
 | 
						|
                if sect_name in parent:
 | 
						|
                    self._handle_error('Duplicate section name at line %s.',
 | 
						|
                                       DuplicateError, infile, cur_index)
 | 
						|
                    continue
 | 
						|
                
 | 
						|
                # create the new section
 | 
						|
                this_section = Section(
 | 
						|
                    parent,
 | 
						|
                    cur_depth,
 | 
						|
                    self,
 | 
						|
                    name=sect_name)
 | 
						|
                parent[sect_name] = this_section
 | 
						|
                parent.inline_comments[sect_name] = comment
 | 
						|
                parent.comments[sect_name] = comment_list
 | 
						|
                continue
 | 
						|
            #
 | 
						|
            # it's not a section marker,
 | 
						|
            # so it should be a valid ``key = value`` line
 | 
						|
            mat = self._keyword.match(line)
 | 
						|
            if mat is None:
 | 
						|
                # it neither matched as a keyword
 | 
						|
                # or a section marker
 | 
						|
                self._handle_error(
 | 
						|
                    'Invalid line at line "%s".',
 | 
						|
                    ParseError, infile, cur_index)
 | 
						|
            else:
 | 
						|
                # is a keyword value
 | 
						|
                # value will include any inline comment
 | 
						|
                (indent, key, value) = mat.groups()
 | 
						|
                if indent and (self.indent_type is None):
 | 
						|
                    self.indent_type = indent
 | 
						|
                # check for a multiline value
 | 
						|
                if value[:3] in ['"""', "'''"]:
 | 
						|
                    try:
 | 
						|
                        value, comment, cur_index = self._multiline(
 | 
						|
                            value, infile, cur_index, maxline)
 | 
						|
                    except SyntaxError:
 | 
						|
                        self._handle_error(
 | 
						|
                            'Parse error in value at line %s.',
 | 
						|
                            ParseError, infile, cur_index)
 | 
						|
                        continue
 | 
						|
                    else:
 | 
						|
                        if self.unrepr:
 | 
						|
                            comment = ''
 | 
						|
                            try:
 | 
						|
                                value = unrepr(value)
 | 
						|
                            except Exception, e:
 | 
						|
                                if type(e) == UnknownType:
 | 
						|
                                    msg = 'Unknown name or type in value at line %s.'
 | 
						|
                                else:
 | 
						|
                                    msg = 'Parse error in value at line %s.'
 | 
						|
                                self._handle_error(msg, UnreprError, infile,
 | 
						|
                                    cur_index)
 | 
						|
                                continue
 | 
						|
                else:
 | 
						|
                    if self.unrepr:
 | 
						|
                        comment = ''
 | 
						|
                        try:
 | 
						|
                            value = unrepr(value)
 | 
						|
                        except Exception, e:
 | 
						|
                            if isinstance(e, UnknownType):
 | 
						|
                                msg = 'Unknown name or type in value at line %s.'
 | 
						|
                            else:
 | 
						|
                                msg = 'Parse error in value at line %s.'
 | 
						|
                            self._handle_error(msg, UnreprError, infile,
 | 
						|
                                cur_index)
 | 
						|
                            continue
 | 
						|
                    else:
 | 
						|
                        # extract comment and lists
 | 
						|
                        try:
 | 
						|
                            (value, comment) = self._handle_value(value)
 | 
						|
                        except SyntaxError:
 | 
						|
                            self._handle_error(
 | 
						|
                                'Parse error in value at line %s.',
 | 
						|
                                ParseError, infile, cur_index)
 | 
						|
                            continue
 | 
						|
                #
 | 
						|
                key = self._unquote(key)
 | 
						|
                if key in this_section:
 | 
						|
                    self._handle_error(
 | 
						|
                        'Duplicate keyword name at line %s.',
 | 
						|
                        DuplicateError, infile, cur_index)
 | 
						|
                    continue
 | 
						|
                # add the key.
 | 
						|
                # we set unrepr because if we have got this far we will never
 | 
						|
                # be creating a new section
 | 
						|
                this_section.__setitem__(key, value, unrepr=True)
 | 
						|
                this_section.inline_comments[key] = comment
 | 
						|
                this_section.comments[key] = comment_list
 | 
						|
                continue
 | 
						|
        #
 | 
						|
        if self.indent_type is None:
 | 
						|
            # no indentation used, set the type accordingly
 | 
						|
            self.indent_type = ''
 | 
						|
 | 
						|
        # preserve the final comment
 | 
						|
        if not self and not self.initial_comment:
 | 
						|
            self.initial_comment = comment_list
 | 
						|
        elif not reset_comment:
 | 
						|
            self.final_comment = comment_list
 | 
						|
        self.list_values = temp_list_values
 | 
						|
 | 
						|
 | 
						|
    def _match_depth(self, sect, depth):
 | 
						|
        """
 | 
						|
        Given a section and a depth level, walk back through the sections
 | 
						|
        parents to see if the depth level matches a previous section.
 | 
						|
        
 | 
						|
        Return a reference to the right section,
 | 
						|
        or raise a SyntaxError.
 | 
						|
        """
 | 
						|
        while depth < sect.depth:
 | 
						|
            if sect is sect.parent:
 | 
						|
                # we've reached the top level already
 | 
						|
                raise SyntaxError()
 | 
						|
            sect = sect.parent
 | 
						|
        if sect.depth == depth:
 | 
						|
            return sect
 | 
						|
        # shouldn't get here
 | 
						|
        raise SyntaxError()
 | 
						|
 | 
						|
 | 
						|
    def _handle_error(self, text, ErrorClass, infile, cur_index):
 | 
						|
        """
 | 
						|
        Handle an error according to the error settings.
 | 
						|
        
 | 
						|
        Either raise the error or store it.
 | 
						|
        The error will have occured at ``cur_index``
 | 
						|
        """
 | 
						|
        line = infile[cur_index]
 | 
						|
        cur_index += 1
 | 
						|
        message = text % cur_index
 | 
						|
        error = ErrorClass(message, cur_index, line)
 | 
						|
        if self.raise_errors:
 | 
						|
            # raise the error - parsing stops here
 | 
						|
            raise error
 | 
						|
        # store the error
 | 
						|
        # reraise when parsing has finished
 | 
						|
        self._errors.append(error)
 | 
						|
 | 
						|
 | 
						|
    def _unquote(self, value):
 | 
						|
        """Return an unquoted version of a value"""
 | 
						|
        if not value:
 | 
						|
            # should only happen during parsing of lists
 | 
						|
            raise SyntaxError
 | 
						|
        if (value[0] == value[-1]) and (value[0] in ('"', "'")):
 | 
						|
            value = value[1:-1]
 | 
						|
        return value
 | 
						|
 | 
						|
 | 
						|
    def _quote(self, value, multiline=True):
 | 
						|
        """
 | 
						|
        Return a safely quoted version of a value.
 | 
						|
        
 | 
						|
        Raise a ConfigObjError if the value cannot be safely quoted.
 | 
						|
        If multiline is ``True`` (default) then use triple quotes
 | 
						|
        if necessary.
 | 
						|
        
 | 
						|
        * Don't quote values that don't need it.
 | 
						|
        * Recursively quote members of a list and return a comma joined list.
 | 
						|
        * Multiline is ``False`` for lists.
 | 
						|
        * Obey list syntax for empty and single member lists.
 | 
						|
        
 | 
						|
        If ``list_values=False`` then the value is only quoted if it contains
 | 
						|
        a ``\\n`` (is multiline) or '#'.
 | 
						|
        
 | 
						|
        If ``write_empty_values`` is set, and the value is an empty string, it
 | 
						|
        won't be quoted.
 | 
						|
        """
 | 
						|
        if multiline and self.write_empty_values and value == '':
 | 
						|
            # Only if multiline is set, so that it is used for values not
 | 
						|
            # keys, and not values that are part of a list
 | 
						|
            return ''
 | 
						|
        
 | 
						|
        if multiline and isinstance(value, (list, tuple)):
 | 
						|
            if not value:
 | 
						|
                return ','
 | 
						|
            elif len(value) == 1:
 | 
						|
                return self._quote(value[0], multiline=False) + ','
 | 
						|
            return ', '.join([self._quote(val, multiline=False)
 | 
						|
                for val in value])
 | 
						|
        if not isinstance(value, basestring):
 | 
						|
            if self.stringify:
 | 
						|
                value = str(value)
 | 
						|
            else:
 | 
						|
                raise TypeError('Value "%s" is not a string.' % value)
 | 
						|
 | 
						|
        if not value:
 | 
						|
            return '""'
 | 
						|
        
 | 
						|
        no_lists_no_quotes = not self.list_values and '\n' not in value and '#' not in value
 | 
						|
        need_triple = multiline and ((("'" in value) and ('"' in value)) or ('\n' in value ))
 | 
						|
        hash_triple_quote = multiline and not need_triple and ("'" in value) and ('"' in value) and ('#' in value)
 | 
						|
        check_for_single = (no_lists_no_quotes or not need_triple) and not hash_triple_quote
 | 
						|
        
 | 
						|
        if check_for_single:
 | 
						|
            if not self.list_values:
 | 
						|
                # we don't quote if ``list_values=False``
 | 
						|
                quot = noquot
 | 
						|
            # for normal values either single or double quotes will do
 | 
						|
            elif '\n' in value:
 | 
						|
                # will only happen if multiline is off - e.g. '\n' in key
 | 
						|
                raise ConfigObjError('Value "%s" cannot be safely quoted.' % value)
 | 
						|
            elif ((value[0] not in wspace_plus) and
 | 
						|
                    (value[-1] not in wspace_plus) and
 | 
						|
                    (',' not in value)):
 | 
						|
                quot = noquot
 | 
						|
            else:
 | 
						|
                quot = self._get_single_quote(value)
 | 
						|
        else:
 | 
						|
            # if value has '\n' or "'" *and* '"', it will need triple quotes
 | 
						|
            quot = self._get_triple_quote(value)
 | 
						|
        
 | 
						|
        if quot == noquot and '#' in value and self.list_values:
 | 
						|
            quot = self._get_single_quote(value)
 | 
						|
                
 | 
						|
        return quot % value
 | 
						|
    
 | 
						|
    
 | 
						|
    def _get_single_quote(self, value):
 | 
						|
        if ("'" in value) and ('"' in value):
 | 
						|
            raise ConfigObjError('Value "%s" cannot be safely quoted.' % value)
 | 
						|
        elif '"' in value:
 | 
						|
            quot = squot
 | 
						|
        else:
 | 
						|
            quot = dquot
 | 
						|
        return quot
 | 
						|
    
 | 
						|
    
 | 
						|
    def _get_triple_quote(self, value):
 | 
						|
        if (value.find('"""') != -1) and (value.find("'''") != -1):
 | 
						|
            raise ConfigObjError('Value "%s" cannot be safely quoted.' % value)
 | 
						|
        if value.find('"""') == -1:
 | 
						|
            quot = tdquot
 | 
						|
        else:
 | 
						|
            quot = tsquot 
 | 
						|
        return quot
 | 
						|
 | 
						|
 | 
						|
    def _handle_value(self, value):
 | 
						|
        """
 | 
						|
        Given a value string, unquote, remove comment,
 | 
						|
        handle lists. (including empty and single member lists)
 | 
						|
        """
 | 
						|
        if self._inspec:
 | 
						|
            # Parsing a configspec so don't handle comments
 | 
						|
            return (value, '')
 | 
						|
        # do we look for lists in values ?
 | 
						|
        if not self.list_values:
 | 
						|
            mat = self._nolistvalue.match(value)
 | 
						|
            if mat is None:
 | 
						|
                raise SyntaxError()
 | 
						|
            # NOTE: we don't unquote here
 | 
						|
            return mat.groups()
 | 
						|
        #
 | 
						|
        mat = self._valueexp.match(value)
 | 
						|
        if mat is None:
 | 
						|
            # the value is badly constructed, probably badly quoted,
 | 
						|
            # or an invalid list
 | 
						|
            raise SyntaxError()
 | 
						|
        (list_values, single, empty_list, comment) = mat.groups()
 | 
						|
        if (list_values == '') and (single is None):
 | 
						|
            # change this if you want to accept empty values
 | 
						|
            raise SyntaxError()
 | 
						|
        # NOTE: note there is no error handling from here if the regex
 | 
						|
        # is wrong: then incorrect values will slip through
 | 
						|
        if empty_list is not None:
 | 
						|
            # the single comma - meaning an empty list
 | 
						|
            return ([], comment)
 | 
						|
        if single is not None:
 | 
						|
            # handle empty values
 | 
						|
            if list_values and not single:
 | 
						|
                # FIXME: the '' is a workaround because our regex now matches
 | 
						|
                #   '' at the end of a list if it has a trailing comma
 | 
						|
                single = None
 | 
						|
            else:
 | 
						|
                single = single or '""'
 | 
						|
                single = self._unquote(single)
 | 
						|
        if list_values == '':
 | 
						|
            # not a list value
 | 
						|
            return (single, comment)
 | 
						|
        the_list = self._listvalueexp.findall(list_values)
 | 
						|
        the_list = [self._unquote(val) for val in the_list]
 | 
						|
        if single is not None:
 | 
						|
            the_list += [single]
 | 
						|
        return (the_list, comment)
 | 
						|
 | 
						|
 | 
						|
    def _multiline(self, value, infile, cur_index, maxline):
 | 
						|
        """Extract the value, where we are in a multiline situation."""
 | 
						|
        quot = value[:3]
 | 
						|
        newvalue = value[3:]
 | 
						|
        single_line = self._triple_quote[quot][0]
 | 
						|
        multi_line = self._triple_quote[quot][1]
 | 
						|
        mat = single_line.match(value)
 | 
						|
        if mat is not None:
 | 
						|
            retval = list(mat.groups())
 | 
						|
            retval.append(cur_index)
 | 
						|
            return retval
 | 
						|
        elif newvalue.find(quot) != -1:
 | 
						|
            # somehow the triple quote is missing
 | 
						|
            raise SyntaxError()
 | 
						|
        #
 | 
						|
        while cur_index < maxline:
 | 
						|
            cur_index += 1
 | 
						|
            newvalue += '\n'
 | 
						|
            line = infile[cur_index]
 | 
						|
            if line.find(quot) == -1:
 | 
						|
                newvalue += line
 | 
						|
            else:
 | 
						|
                # end of multiline, process it
 | 
						|
                break
 | 
						|
        else:
 | 
						|
            # we've got to the end of the config, oops...
 | 
						|
            raise SyntaxError()
 | 
						|
        mat = multi_line.match(line)
 | 
						|
        if mat is None:
 | 
						|
            # a badly formed line
 | 
						|
            raise SyntaxError()
 | 
						|
        (value, comment) = mat.groups()
 | 
						|
        return (newvalue + value, comment, cur_index)
 | 
						|
 | 
						|
 | 
						|
    def _handle_configspec(self, configspec):
 | 
						|
        """Parse the configspec."""
 | 
						|
        # FIXME: Should we check that the configspec was created with the 
 | 
						|
        #        correct settings ? (i.e. ``list_values=False``)
 | 
						|
        if not isinstance(configspec, ConfigObj):
 | 
						|
            try:
 | 
						|
                configspec = ConfigObj(configspec,
 | 
						|
                                       raise_errors=True,
 | 
						|
                                       file_error=True,
 | 
						|
                                       _inspec=True)
 | 
						|
            except ConfigObjError, e:
 | 
						|
                # FIXME: Should these errors have a reference
 | 
						|
                #        to the already parsed ConfigObj ?
 | 
						|
                raise ConfigspecError('Parsing configspec failed: %s' % e)
 | 
						|
            except IOError, e:
 | 
						|
                raise IOError('Reading configspec failed: %s' % e)
 | 
						|
        
 | 
						|
        self.configspec = configspec
 | 
						|
            
 | 
						|
 | 
						|
        
 | 
						|
    def _set_configspec(self, section, copy):
 | 
						|
        """
 | 
						|
        Called by validate. Handles setting the configspec on subsections
 | 
						|
        including sections to be validated by __many__
 | 
						|
        """
 | 
						|
        configspec = section.configspec
 | 
						|
        many = configspec.get('__many__')
 | 
						|
        if isinstance(many, dict):
 | 
						|
            for entry in section.sections:
 | 
						|
                if entry not in configspec:
 | 
						|
                    section[entry].configspec = many
 | 
						|
                    
 | 
						|
        for entry in configspec.sections:
 | 
						|
            if entry == '__many__':
 | 
						|
                continue
 | 
						|
            if entry not in section:
 | 
						|
                section[entry] = {}
 | 
						|
                section[entry]._created = True
 | 
						|
                if copy:
 | 
						|
                    # copy comments
 | 
						|
                    section.comments[entry] = configspec.comments.get(entry, [])
 | 
						|
                    section.inline_comments[entry] = configspec.inline_comments.get(entry, '')
 | 
						|
                
 | 
						|
            # Could be a scalar when we expect a section
 | 
						|
            if isinstance(section[entry], Section):
 | 
						|
                section[entry].configspec = configspec[entry]
 | 
						|
                        
 | 
						|
 | 
						|
    def _write_line(self, indent_string, entry, this_entry, comment):
 | 
						|
        """Write an individual line, for the write method"""
 | 
						|
        # NOTE: the calls to self._quote here handles non-StringType values.
 | 
						|
        if not self.unrepr:
 | 
						|
            val = self._decode_element(self._quote(this_entry))
 | 
						|
        else:
 | 
						|
            val = repr(this_entry)
 | 
						|
        return '%s%s%s%s%s' % (indent_string,
 | 
						|
                               self._decode_element(self._quote(entry, multiline=False)),
 | 
						|
                               self._a_to_u(' = '),
 | 
						|
                               val,
 | 
						|
                               self._decode_element(comment))
 | 
						|
 | 
						|
 | 
						|
    def _write_marker(self, indent_string, depth, entry, comment):
 | 
						|
        """Write a section marker line"""
 | 
						|
        return '%s%s%s%s%s' % (indent_string,
 | 
						|
                               self._a_to_u('[' * depth),
 | 
						|
                               self._quote(self._decode_element(entry), multiline=False),
 | 
						|
                               self._a_to_u(']' * depth),
 | 
						|
                               self._decode_element(comment))
 | 
						|
 | 
						|
 | 
						|
    def _handle_comment(self, comment):
 | 
						|
        """Deal with a comment."""
 | 
						|
        if not comment:
 | 
						|
            return ''
 | 
						|
        start = self.indent_type
 | 
						|
        if not comment.startswith('#'):
 | 
						|
            start += self._a_to_u(' # ')
 | 
						|
        return (start + comment)
 | 
						|
 | 
						|
 | 
						|
    # Public methods
 | 
						|
 | 
						|
    def write(self, outfile=None, section=None):
 | 
						|
        """
 | 
						|
        Write the current ConfigObj as a file
 | 
						|
        
 | 
						|
        tekNico: FIXME: use StringIO instead of real files
 | 
						|
        
 | 
						|
        >>> filename = a.filename
 | 
						|
        >>> a.filename = 'test.ini'
 | 
						|
        >>> a.write()
 | 
						|
        >>> a.filename = filename
 | 
						|
        >>> a == ConfigObj('test.ini', raise_errors=True)
 | 
						|
        1
 | 
						|
        >>> import os
 | 
						|
        >>> os.remove('test.ini')
 | 
						|
        """
 | 
						|
        if self.indent_type is None:
 | 
						|
            # this can be true if initialised from a dictionary
 | 
						|
            self.indent_type = DEFAULT_INDENT_TYPE
 | 
						|
            
 | 
						|
        out = []
 | 
						|
        cs = self._a_to_u('#')
 | 
						|
        csp = self._a_to_u('# ')
 | 
						|
        if section is None:
 | 
						|
            int_val = self.interpolation
 | 
						|
            self.interpolation = False
 | 
						|
            section = self
 | 
						|
            for line in self.initial_comment:
 | 
						|
                line = self._decode_element(line)
 | 
						|
                stripped_line = line.strip()
 | 
						|
                if stripped_line and not stripped_line.startswith(cs):
 | 
						|
                    line = csp + line
 | 
						|
                out.append(line)
 | 
						|
                
 | 
						|
        indent_string = self.indent_type * section.depth
 | 
						|
        for entry in (section.scalars + section.sections):
 | 
						|
            if entry in section.defaults:
 | 
						|
                # don't write out default values
 | 
						|
                continue
 | 
						|
            for comment_line in section.comments[entry]:
 | 
						|
                comment_line = self._decode_element(comment_line.lstrip())
 | 
						|
                if comment_line and not comment_line.startswith(cs):
 | 
						|
                    comment_line = csp + comment_line
 | 
						|
                out.append(indent_string + comment_line)
 | 
						|
            this_entry = section[entry]
 | 
						|
            comment = self._handle_comment(section.inline_comments[entry])
 | 
						|
            
 | 
						|
            if isinstance(this_entry, dict):
 | 
						|
                # a section
 | 
						|
                out.append(self._write_marker(
 | 
						|
                    indent_string,
 | 
						|
                    this_entry.depth,
 | 
						|
                    entry,
 | 
						|
                    comment))
 | 
						|
                out.extend(self.write(section=this_entry))
 | 
						|
            else:
 | 
						|
                out.append(self._write_line(
 | 
						|
                    indent_string,
 | 
						|
                    entry,
 | 
						|
                    this_entry,
 | 
						|
                    comment))
 | 
						|
                
 | 
						|
        if section is self:
 | 
						|
            for line in self.final_comment:
 | 
						|
                line = self._decode_element(line)
 | 
						|
                stripped_line = line.strip()
 | 
						|
                if stripped_line and not stripped_line.startswith(cs):
 | 
						|
                    line = csp + line
 | 
						|
                out.append(line)
 | 
						|
            self.interpolation = int_val
 | 
						|
            
 | 
						|
        if section is not self:
 | 
						|
            return out
 | 
						|
        
 | 
						|
        if (self.filename is None) and (outfile is None):
 | 
						|
            # output a list of lines
 | 
						|
            # might need to encode
 | 
						|
            # NOTE: This will *screw* UTF16, each line will start with the BOM
 | 
						|
            if self.encoding:
 | 
						|
                out = [l.encode(self.encoding) for l in out]
 | 
						|
            if (self.BOM and ((self.encoding is None) or
 | 
						|
                (BOM_LIST.get(self.encoding.lower()) == 'utf_8'))):
 | 
						|
                # Add the UTF8 BOM
 | 
						|
                if not out:
 | 
						|
                    out.append('')
 | 
						|
                out[0] = BOM_UTF8 + out[0]
 | 
						|
            return out
 | 
						|
        
 | 
						|
        # Turn the list to a string, joined with correct newlines
 | 
						|
        newline = self.newlines or os.linesep
 | 
						|
        if (getattr(outfile, 'mode', None) is not None and outfile.mode == 'w'
 | 
						|
            and sys.platform == 'win32' and newline == '\r\n'):
 | 
						|
            # Windows specific hack to avoid writing '\r\r\n'
 | 
						|
            newline = '\n'
 | 
						|
        output = self._a_to_u(newline).join(out)
 | 
						|
        if self.encoding:
 | 
						|
            output = output.encode(self.encoding)
 | 
						|
        if self.BOM and ((self.encoding is None) or match_utf8(self.encoding)):
 | 
						|
            # Add the UTF8 BOM
 | 
						|
            output = BOM_UTF8 + output
 | 
						|
            
 | 
						|
        if not output.endswith(newline):
 | 
						|
            output += newline
 | 
						|
        if outfile is not None:
 | 
						|
            outfile.write(output)
 | 
						|
        else:
 | 
						|
            h = open(self.filename, 'wb')
 | 
						|
            h.write(output)
 | 
						|
            h.close()
 | 
						|
 | 
						|
 | 
						|
    def validate(self, validator, preserve_errors=False, copy=False,
 | 
						|
                 section=None):
 | 
						|
        """
 | 
						|
        Test the ConfigObj against a configspec.
 | 
						|
        
 | 
						|
        It uses the ``validator`` object from *validate.py*.
 | 
						|
        
 | 
						|
        To run ``validate`` on the current ConfigObj, call: ::
 | 
						|
        
 | 
						|
            test = config.validate(validator)
 | 
						|
        
 | 
						|
        (Normally having previously passed in the configspec when the ConfigObj
 | 
						|
        was created - you can dynamically assign a dictionary of checks to the
 | 
						|
        ``configspec`` attribute of a section though).
 | 
						|
        
 | 
						|
        It returns ``True`` if everything passes, or a dictionary of
 | 
						|
        pass/fails (True/False). If every member of a subsection passes, it
 | 
						|
        will just have the value ``True``. (It also returns ``False`` if all
 | 
						|
        members fail).
 | 
						|
        
 | 
						|
        In addition, it converts the values from strings to their native
 | 
						|
        types if their checks pass (and ``stringify`` is set).
 | 
						|
        
 | 
						|
        If ``preserve_errors`` is ``True`` (``False`` is default) then instead
 | 
						|
        of a marking a fail with a ``False``, it will preserve the actual
 | 
						|
        exception object. This can contain info about the reason for failure.
 | 
						|
        For example the ``VdtValueTooSmallError`` indicates that the value
 | 
						|
        supplied was too small. If a value (or section) is missing it will
 | 
						|
        still be marked as ``False``.
 | 
						|
        
 | 
						|
        You must have the validate module to use ``preserve_errors=True``.
 | 
						|
        
 | 
						|
        You can then use the ``flatten_errors`` function to turn your nested
 | 
						|
        results dictionary into a flattened list of failures - useful for
 | 
						|
        displaying meaningful error messages.
 | 
						|
        """
 | 
						|
        if section is None:
 | 
						|
            if self.configspec is None:
 | 
						|
                raise ValueError('No configspec supplied.')
 | 
						|
            if preserve_errors:
 | 
						|
                # We do this once to remove a top level dependency on the validate module
 | 
						|
                # Which makes importing configobj faster
 | 
						|
                from validate import VdtMissingValue
 | 
						|
                self._vdtMissingValue = VdtMissingValue
 | 
						|
                
 | 
						|
            section = self
 | 
						|
 | 
						|
            if copy:
 | 
						|
                section.initial_comment = section.configspec.initial_comment
 | 
						|
                section.final_comment = section.configspec.final_comment
 | 
						|
                section.encoding = section.configspec.encoding
 | 
						|
                section.BOM = section.configspec.BOM
 | 
						|
                section.newlines = section.configspec.newlines
 | 
						|
                section.indent_type = section.configspec.indent_type
 | 
						|
            
 | 
						|
        #
 | 
						|
        # section.default_values.clear() #??
 | 
						|
        configspec = section.configspec
 | 
						|
        self._set_configspec(section, copy)
 | 
						|
 | 
						|
        
 | 
						|
        def validate_entry(entry, spec, val, missing, ret_true, ret_false):
 | 
						|
            section.default_values.pop(entry, None)
 | 
						|
                
 | 
						|
            try:
 | 
						|
                section.default_values[entry] = validator.get_default_value(configspec[entry])
 | 
						|
            except (KeyError, AttributeError, validator.baseErrorClass):
 | 
						|
                # No default, bad default or validator has no 'get_default_value'
 | 
						|
                # (e.g. SimpleVal)
 | 
						|
                pass
 | 
						|
            
 | 
						|
            try:
 | 
						|
                check = validator.check(spec,
 | 
						|
                                        val,
 | 
						|
                                        missing=missing
 | 
						|
                                        )
 | 
						|
            except validator.baseErrorClass, e:
 | 
						|
                if not preserve_errors or isinstance(e, self._vdtMissingValue):
 | 
						|
                    out[entry] = False
 | 
						|
                else:
 | 
						|
                    # preserve the error
 | 
						|
                    out[entry] = e
 | 
						|
                    ret_false = False
 | 
						|
                ret_true = False
 | 
						|
            else:
 | 
						|
                ret_false = False
 | 
						|
                out[entry] = True
 | 
						|
                if self.stringify or missing:
 | 
						|
                    # if we are doing type conversion
 | 
						|
                    # or the value is a supplied default
 | 
						|
                    if not self.stringify:
 | 
						|
                        if isinstance(check, (list, tuple)):
 | 
						|
                            # preserve lists
 | 
						|
                            check = [self._str(item) for item in check]
 | 
						|
                        elif missing and check is None:
 | 
						|
                            # convert the None from a default to a ''
 | 
						|
                            check = ''
 | 
						|
                        else:
 | 
						|
                            check = self._str(check)
 | 
						|
                    if (check != val) or missing:
 | 
						|
                        section[entry] = check
 | 
						|
                if not copy and missing and entry not in section.defaults:
 | 
						|
                    section.defaults.append(entry)
 | 
						|
            return ret_true, ret_false
 | 
						|
        
 | 
						|
        #
 | 
						|
        out = {}
 | 
						|
        ret_true = True
 | 
						|
        ret_false = True
 | 
						|
        
 | 
						|
        unvalidated = [k for k in section.scalars if k not in configspec]
 | 
						|
        incorrect_sections = [k for k in configspec.sections if k in section.scalars]        
 | 
						|
        incorrect_scalars = [k for k in configspec.scalars if k in section.sections]
 | 
						|
        
 | 
						|
        for entry in configspec.scalars:
 | 
						|
            if entry in ('__many__', '___many___'):
 | 
						|
                # reserved names
 | 
						|
                continue
 | 
						|
            if (not entry in section.scalars) or (entry in section.defaults):
 | 
						|
                # missing entries
 | 
						|
                # or entries from defaults
 | 
						|
                missing = True
 | 
						|
                val = None
 | 
						|
                if copy and entry not in section.scalars:
 | 
						|
                    # copy comments
 | 
						|
                    section.comments[entry] = (
 | 
						|
                        configspec.comments.get(entry, []))
 | 
						|
                    section.inline_comments[entry] = (
 | 
						|
                        configspec.inline_comments.get(entry, ''))
 | 
						|
                #
 | 
						|
            else:
 | 
						|
                missing = False
 | 
						|
                val = section[entry]
 | 
						|
            
 | 
						|
            ret_true, ret_false = validate_entry(entry, configspec[entry], val, 
 | 
						|
                                                 missing, ret_true, ret_false)
 | 
						|
        
 | 
						|
        many = None
 | 
						|
        if '__many__' in configspec.scalars:
 | 
						|
            many = configspec['__many__']
 | 
						|
        elif '___many___' in configspec.scalars:
 | 
						|
            many = configspec['___many___']
 | 
						|
        
 | 
						|
        if many is not None:
 | 
						|
            for entry in unvalidated:
 | 
						|
                val = section[entry]
 | 
						|
                ret_true, ret_false = validate_entry(entry, many, val, False,
 | 
						|
                                                     ret_true, ret_false)
 | 
						|
            unvalidated = []
 | 
						|
 | 
						|
        for entry in incorrect_scalars:
 | 
						|
            ret_true = False
 | 
						|
            if not preserve_errors:
 | 
						|
                out[entry] = False
 | 
						|
            else:
 | 
						|
                ret_false = False
 | 
						|
                msg = 'Value %r was provided as a section' % entry
 | 
						|
                out[entry] = validator.baseErrorClass(msg)
 | 
						|
        for entry in incorrect_sections:
 | 
						|
            ret_true = False
 | 
						|
            if not preserve_errors:
 | 
						|
                out[entry] = False
 | 
						|
            else:
 | 
						|
                ret_false = False
 | 
						|
                msg = 'Section %r was provided as a single value' % entry
 | 
						|
                out[entry] = validator.baseErrorClass(msg)
 | 
						|
                
 | 
						|
        # Missing sections will have been created as empty ones when the
 | 
						|
        # configspec was read.
 | 
						|
        for entry in section.sections:
 | 
						|
            # FIXME: this means DEFAULT is not copied in copy mode
 | 
						|
            if section is self and entry == 'DEFAULT':
 | 
						|
                continue
 | 
						|
            if section[entry].configspec is None:
 | 
						|
                unvalidated.append(entry)
 | 
						|
                continue
 | 
						|
            if copy:
 | 
						|
                section.comments[entry] = configspec.comments.get(entry, [])
 | 
						|
                section.inline_comments[entry] = configspec.inline_comments.get(entry, '')
 | 
						|
            check = self.validate(validator, preserve_errors=preserve_errors, copy=copy, section=section[entry])
 | 
						|
            out[entry] = check
 | 
						|
            if check == False:
 | 
						|
                ret_true = False
 | 
						|
            elif check == True:
 | 
						|
                ret_false = False
 | 
						|
            else:
 | 
						|
                ret_true = False
 | 
						|
        
 | 
						|
        section.extra_values = unvalidated
 | 
						|
        if preserve_errors and not section._created:
 | 
						|
            # If the section wasn't created (i.e. it wasn't missing)
 | 
						|
            # then we can't return False, we need to preserve errors
 | 
						|
            ret_false = False
 | 
						|
        #
 | 
						|
        if ret_false and preserve_errors and out:
 | 
						|
            # If we are preserving errors, but all
 | 
						|
            # the failures are from missing sections / values
 | 
						|
            # then we can return False. Otherwise there is a
 | 
						|
            # real failure that we need to preserve.
 | 
						|
            ret_false = not any(out.values())
 | 
						|
        if ret_true:
 | 
						|
            return True
 | 
						|
        elif ret_false:
 | 
						|
            return False
 | 
						|
        return out
 | 
						|
 | 
						|
 | 
						|
    def reset(self):
 | 
						|
        """Clear ConfigObj instance and restore to 'freshly created' state."""
 | 
						|
        self.clear()
 | 
						|
        self._initialise()
 | 
						|
        # FIXME: Should be done by '_initialise', but ConfigObj constructor (and reload)
 | 
						|
        #        requires an empty dictionary
 | 
						|
        self.configspec = None
 | 
						|
        # Just to be sure ;-)
 | 
						|
        self._original_configspec = None
 | 
						|
        
 | 
						|
        
 | 
						|
    def reload(self):
 | 
						|
        """
 | 
						|
        Reload a ConfigObj from file.
 | 
						|
        
 | 
						|
        This method raises a ``ReloadError`` if the ConfigObj doesn't have
 | 
						|
        a filename attribute pointing to a file.
 | 
						|
        """
 | 
						|
        if not isinstance(self.filename, basestring):
 | 
						|
            raise ReloadError()
 | 
						|
 | 
						|
        filename = self.filename
 | 
						|
        current_options = {}
 | 
						|
        for entry in OPTION_DEFAULTS:
 | 
						|
            if entry == 'configspec':
 | 
						|
                continue
 | 
						|
            current_options[entry] = getattr(self, entry)
 | 
						|
            
 | 
						|
        configspec = self._original_configspec
 | 
						|
        current_options['configspec'] = configspec
 | 
						|
            
 | 
						|
        self.clear()
 | 
						|
        self._initialise(current_options)
 | 
						|
        self._load(filename, configspec)
 | 
						|
        
 | 
						|
 | 
						|
 | 
						|
class SimpleVal(object):
 | 
						|
    """
 | 
						|
    A simple validator.
 | 
						|
    Can be used to check that all members expected are present.
 | 
						|
    
 | 
						|
    To use it, provide a configspec with all your members in (the value given
 | 
						|
    will be ignored). Pass an instance of ``SimpleVal`` to the ``validate``
 | 
						|
    method of your ``ConfigObj``. ``validate`` will return ``True`` if all
 | 
						|
    members are present, or a dictionary with True/False meaning
 | 
						|
    present/missing. (Whole missing sections will be replaced with ``False``)
 | 
						|
    """
 | 
						|
    
 | 
						|
    def __init__(self):
 | 
						|
        self.baseErrorClass = ConfigObjError
 | 
						|
    
 | 
						|
    def check(self, check, member, missing=False):
 | 
						|
        """A dummy check method, always returns the value unchanged."""
 | 
						|
        if missing:
 | 
						|
            raise self.baseErrorClass()
 | 
						|
        return member
 | 
						|
 | 
						|
 | 
						|
def flatten_errors(cfg, res, levels=None, results=None):
 | 
						|
    """
 | 
						|
    An example function that will turn a nested dictionary of results
 | 
						|
    (as returned by ``ConfigObj.validate``) into a flat list.
 | 
						|
    
 | 
						|
    ``cfg`` is the ConfigObj instance being checked, ``res`` is the results
 | 
						|
    dictionary returned by ``validate``.
 | 
						|
    
 | 
						|
    (This is a recursive function, so you shouldn't use the ``levels`` or
 | 
						|
    ``results`` arguments - they are used by the function.)
 | 
						|
    
 | 
						|
    Returns a list of keys that failed. Each member of the list is a tuple::
 | 
						|
    
 | 
						|
        ([list of sections...], key, result)
 | 
						|
    
 | 
						|
    If ``validate`` was called with ``preserve_errors=False`` (the default)
 | 
						|
    then ``result`` will always be ``False``.
 | 
						|
 | 
						|
    *list of sections* is a flattened list of sections that the key was found
 | 
						|
    in.
 | 
						|
    
 | 
						|
    If the section was missing (or a section was expected and a scalar provided
 | 
						|
    - or vice-versa) then key will be ``None``.
 | 
						|
    
 | 
						|
    If the value (or section) was missing then ``result`` will be ``False``.
 | 
						|
    
 | 
						|
    If ``validate`` was called with ``preserve_errors=True`` and a value
 | 
						|
    was present, but failed the check, then ``result`` will be the exception
 | 
						|
    object returned. You can use this as a string that describes the failure.
 | 
						|
    
 | 
						|
    For example *The value "3" is of the wrong type*.
 | 
						|
    """
 | 
						|
    if levels is None:
 | 
						|
        # first time called
 | 
						|
        levels = []
 | 
						|
        results = []
 | 
						|
    if res == True:
 | 
						|
        return results
 | 
						|
    if res == False or isinstance(res, Exception):
 | 
						|
        results.append((levels[:], None, res))
 | 
						|
        if levels:
 | 
						|
            levels.pop()
 | 
						|
        return results
 | 
						|
    for (key, val) in res.items():
 | 
						|
        if val == True:
 | 
						|
            continue
 | 
						|
        if isinstance(cfg.get(key), dict):
 | 
						|
            # Go down one level
 | 
						|
            levels.append(key)
 | 
						|
            flatten_errors(cfg[key], val, levels, results)
 | 
						|
            continue
 | 
						|
        results.append((levels[:], key, val))
 | 
						|
    #
 | 
						|
    # Go up one level
 | 
						|
    if levels:
 | 
						|
        levels.pop()
 | 
						|
    #
 | 
						|
    return results
 | 
						|
 | 
						|
 | 
						|
def get_extra_values(conf, _prepend=()):
 | 
						|
    """
 | 
						|
    Find all the values and sections not in the configspec from a validated
 | 
						|
    ConfigObj.
 | 
						|
    
 | 
						|
    ``get_extra_values`` returns a list of tuples where each tuple represents
 | 
						|
    either an extra section, or an extra value.
 | 
						|
    
 | 
						|
    The tuples contain two values, a tuple representing the section the value 
 | 
						|
    is in and the name of the extra values. For extra values in the top level
 | 
						|
    section the first member will be an empty tuple. For values in the 'foo'
 | 
						|
    section the first member will be ``('foo',)``. For members in the 'bar'
 | 
						|
    subsection of the 'foo' section the first member will be ``('foo', 'bar')``.
 | 
						|
    
 | 
						|
    NOTE: If you call ``get_extra_values`` on a ConfigObj instance that hasn't
 | 
						|
    been validated it will return an empty list.
 | 
						|
    """
 | 
						|
    out = []
 | 
						|
    
 | 
						|
    out.extend([(_prepend, name) for name in conf.extra_values])
 | 
						|
    for name in conf.sections:
 | 
						|
        if name not in conf.extra_values:
 | 
						|
            out.extend(get_extra_values(conf[name], _prepend + (name,)))
 | 
						|
    return out
 | 
						|
 | 
						|
 | 
						|
"""*A programming language is a medium of expression.* - Paul Graham"""
 |