Paver-1.2.1/0000755000175000017500000000000012152711214012742 5ustar almadalmad00000000000000Paver-1.2.1/setup.cfg0000644000175000017500000000007312152711214014563 0ustar almadalmad00000000000000[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 Paver-1.2.1/MANIFEST.in0000644000175000017500000000030112152711177014502 0ustar almadalmad00000000000000include LICENSE.txt include README.rst include distutils_scripts/* recursive-include paver/docs * include paver-minilib.zip include setup.py recursive-include paver/tests * include pavement.py Paver-1.2.1/setup.py0000644000175000017500000000034112152711214014452 0ustar almadalmad00000000000000try: import paver.tasks except ImportError: from os.path import exists if exists("paver-minilib.zip"): import sys sys.path.insert(0, "paver-minilib.zip") import paver.tasks paver.tasks.main() Paver-1.2.1/README.rst0000644000175000017500000000415512152711177014446 0ustar almadalmad00000000000000============================================== Paver - Easy Scripting for Software Projects ============================================== .. image:: https://github.com/paver/paver/blob/master/docs/source/_static/paver_banner.jpg?raw=true :height: 126 :width: 240 :Web: http://packages.python.org/Paver/ :Download: https://pypi.python.org/pypi/Paver/ :Source: http://github.com/paver/paver/ :Keywords: build, scripting, make alternative, svn, git, path.py, documentation, automation, tasks, virtualenv, integration -- .. _paver-synopsis: Paver is a Python-based software project scripting tool along the lines of Make or Rake. It is not designed to handle the dependency tracking requirements of, for example, a C program. It is designed to help out with all of your other repetitive tasks (run documentation generators, moving files about, downloading things), all with the convenience of Python’s syntax and massive library of code. Documentation ============= Current build status: .. image:: https://secure.travis-ci.org/paver/paver.png?branch=master `Documentation`_ is hosted on PyPI (docs for development version are on `GitHub `_). .. _`Documentation`: http://packages.python.org/Paver/ .. _paver-installation: Installation ============ You can install Paver either via the Python Package Index (PyPI) or from source. To install using `pip`,:: $ pip install -U Paver To install using `easy_install`:: $ easy_install -U Paver .. _getting-help: Getting Help ============ .. _mailing-list: Mailing list ------------ For any discussion about usage or development of Paver, you are welcomed to join the `paver mailing list`_ . .. _`paver mailing list`: http://groups.google.com/group/paver/ IRC --- Come chat with us on IRC. The `#paver`_ channel is located at the `Freenode`_ network. .. _`#paver`: irc://irc.freenode.net/paver .. _`Freenode`: http://freenode.net .. _bug-tracker: Bug tracker =========== If you have any suggestions, bug reports or annoyances please report them to GitHub `issue tracker`_. .. _`issue tracker`: http://github.com/paver/paver/issues/ Paver-1.2.1/Paver.egg-info/0000755000175000017500000000000012152711214015511 5ustar almadalmad00000000000000Paver-1.2.1/Paver.egg-info/SOURCES.txt0000644000175000017500000000561212152711214017401 0ustar almadalmad00000000000000LICENSE.txt MANIFEST.in README.rst pavement.py paver-minilib.zip setup.py Paver.egg-info/PKG-INFO Paver.egg-info/SOURCES.txt Paver.egg-info/dependency_links.txt Paver.egg-info/entry_points.txt Paver.egg-info/not-zip-safe Paver.egg-info/top_level.txt distutils_scripts/paver paver/__init__.py paver/bzr.py paver/command.py paver/defaults.py paver/doctools.py paver/easy.py paver/git.py paver/misctasks.py paver/options.py paver/path.py paver/path25.py paver/release.py paver/runtime.py paver/setuputils.py paver/ssh.py paver/svn.py paver/tasks.py paver/version.py paver/virtual.py paver/deps/__init__.py paver/deps/path2.py paver/deps/path3.py paver/deps/six.py paver/docs/.buildinfo paver/docs/articles.html paver/docs/bzr.html paver/docs/changelog.html paver/docs/cmdline.html paver/docs/credits.html paver/docs/doctools.html paver/docs/features.html paver/docs/files.html paver/docs/foreword.html paver/docs/genindex.html paver/docs/getting_started.html paver/docs/index.html paver/docs/misctasks.html paver/docs/objects.inv paver/docs/pavement.html paver/docs/paverstdlib.html paver/docs/py-modindex.html paver/docs/search.html paver/docs/searchindex.js paver/docs/setuptools.html paver/docs/ssh.html paver/docs/svn.html paver/docs/tips.html paver/docs/virtualenv.html paver/docs/_images/paver_banner.jpg paver/docs/_sources/articles.txt paver/docs/_sources/bzr.txt paver/docs/_sources/changelog.txt paver/docs/_sources/cmdline.txt paver/docs/_sources/credits.txt paver/docs/_sources/doctools.txt paver/docs/_sources/features.txt paver/docs/_sources/files.txt paver/docs/_sources/foreword.txt paver/docs/_sources/getting_started.txt paver/docs/_sources/index.txt paver/docs/_sources/misctasks.txt paver/docs/_sources/pavement.txt paver/docs/_sources/paverstdlib.txt paver/docs/_sources/setuptools.txt paver/docs/_sources/ssh.txt paver/docs/_sources/svn.txt paver/docs/_sources/tips.txt paver/docs/_sources/virtualenv.txt paver/docs/_static/ajax-loader.gif paver/docs/_static/basic.css paver/docs/_static/comment-bright.png paver/docs/_static/comment-close.png paver/docs/_static/comment.png paver/docs/_static/default.css paver/docs/_static/doctools.js paver/docs/_static/down-pressed.png paver/docs/_static/down.png paver/docs/_static/file.png paver/docs/_static/jquery.js paver/docs/_static/minus.png paver/docs/_static/paver_banner.jpg paver/docs/_static/plus.png paver/docs/_static/pygments.css paver/docs/_static/searchtools.js paver/docs/_static/sidebar.js paver/docs/_static/underscore.js paver/docs/_static/up-pressed.png paver/docs/_static/up.png paver/docs/_static/websupport.js paver/tests/__init__.py paver/tests/other_pavement.py paver/tests/test_doctools.py paver/tests/test_easy.py paver/tests/test_git.py paver/tests/test_options.py paver/tests/test_path.py paver/tests/test_setuputils.py paver/tests/test_svn.py paver/tests/test_tasks.py paver/tests/utils.py paver/tests/data/t1.py paver/tests/data/t2.py paver/tests/data/textfile.rstPaver-1.2.1/Paver.egg-info/entry_points.txt0000644000175000017500000000005412152711214021006 0ustar almadalmad00000000000000 [console_scripts] paver = paver.tasks:main Paver-1.2.1/Paver.egg-info/dependency_links.txt0000644000175000017500000000000112152711214021557 0ustar almadalmad00000000000000 Paver-1.2.1/Paver.egg-info/top_level.txt0000644000175000017500000000000612152711214020237 0ustar almadalmad00000000000000paver Paver-1.2.1/Paver.egg-info/PKG-INFO0000644000175000017500000000262312152711214016611 0ustar almadalmad00000000000000Metadata-Version: 1.1 Name: Paver Version: 1.2.1 Summary: Easy build, distribution and deployment scripting Home-page: http://github.com/paver/paver Author: Lukas Linhart Author-email: bugs@almad.net License: UNKNOWN Description: Paver is a Python-based build/distribution/deployment scripting tool along the lines of Make or Rake. What makes Paver unique is its integration with commonly used Python libraries. Common tasks that were easy before remain easy. More importantly, dealing with *your* applications specific needs and requirements is also easy. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Environment :: Console Classifier: Topic :: Documentation Classifier: Topic :: Utilities Classifier: Topic :: Software Development :: Build Tools Paver-1.2.1/Paver.egg-info/not-zip-safe0000644000175000017500000000000112152711210017733 0ustar almadalmad00000000000000 Paver-1.2.1/PKG-INFO0000644000175000017500000000262312152711214014042 0ustar almadalmad00000000000000Metadata-Version: 1.1 Name: Paver Version: 1.2.1 Summary: Easy build, distribution and deployment scripting Home-page: http://github.com/paver/paver Author: Lukas Linhart Author-email: bugs@almad.net License: UNKNOWN Description: Paver is a Python-based build/distribution/deployment scripting tool along the lines of Make or Rake. What makes Paver unique is its integration with commonly used Python libraries. Common tasks that were easy before remain easy. More importantly, dealing with *your* applications specific needs and requirements is also easy. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Environment :: Console Classifier: Topic :: Documentation Classifier: Topic :: Utilities Classifier: Topic :: Software Development :: Build Tools Paver-1.2.1/pavement.py0000644000175000017500000001754412152711177015156 0ustar almadalmad00000000000000from paver.easy import * from paver.release import setup_meta import paver.doctools import paver.virtual import paver.misctasks from paver.setuputils import setup options = environment.options setup(**setup_meta) options( minilib=Bunch( extra_files=['doctools', 'virtual'], versioned_name=False, ), sphinx=Bunch( builddir="build", sourcedir="source" ), virtualenv=Bunch( packages_to_install=["nose", "Sphinx>=0.6b1", "docutils", "virtualenv"], install_paver=False, script_name='bootstrap.py', paver_command_line=None, dest_dir="virtualenv" ), cog=Bunch( includedir="docs/samples", beginspec="<==", endspec="==>", endoutput="<==end==>" ), deploy=Bunch( deploydir="blueskyonmars.com/projects/paver" ) ) # not only does paver bootstrap itself, but it should work even with just # distutils if paver.setuputils.has_setuptools: old_sdist = "setuptools.command.sdist" options.setup.update(dict( install_requires=[], test_suite='nose.collector', zip_safe=False, entry_points=""" [console_scripts] paver = paver.tasks:main """ )) else: old_sdist = "distutils.command.sdist" options.setup.scripts = ['distutils_scripts/paver'] options.setup.package_data=paver.setuputils.find_package_data("paver", package="paver", only_in_packages=False) if paver.doctools.has_sphinx: @task @needs('cog', 'paver.doctools.html') def html(): """Build Paver's documentation and install it into paver/docs""" builtdocs = path("docs") / options.sphinx.builddir / "html" destdir = path("paver") / "docs" destdir.rmtree_p() builtdocs.move(destdir) @task @needs('html', "minilib", "generate_setup", old_sdist) def sdist(): """Builds the documentation and the tarball.""" pass if paver.virtual.has_virtualenv: @task def bootstrap(): """Build a virtualenv bootstrap for developing paver.""" # we have to pull some private api shenanigans that normal people don't # because we're bootstrapping paver itself. paver.virtual._create_bootstrap(options.script_name, options.packages_to_install, options.paver_command_line, options.install_paver, more_text=""" subprocess.call([join(""" """bin_dir, 'python'), '-c', """ """'import sys; sys.path.append("."); """ """import paver.command; paver.command.main()', """ """'develop'])""", dest_dir=options.virtualenv.dest_dir) @task def clean(): """Cleans up this paver directory. Removes the virtualenv traces and the build directory.""" path("build").rmtree_p() path("bin").rmtree_p() path("lib").rmtree_p() path(".Python").remove_p() @task @needs("uncog") @consume_args def commit(args): """Removes the generated code from the docs and then commits to bzr.""" sh("git commit " + ' '.join(args)) @task @cmdopts([ ("branch=", "b", "Branch from which to publish"), ("docs-branch=", "d", "Docs branch to commit/push to"), ("git-repo=", "g", "Github repository to use"), ("deploy-key=", "k", "Deploy key to use"), ]) def publish_docs(options): """Publish current docs/site do paver.github.com""" # we are going to mess around with files, so do it in temporary place import os from subprocess import check_call, CalledProcessError from tempfile import mkdtemp, mkstemp current_repo = path(os.curdir).abspath() branch = getattr(options, 'branch', 'master') docs_branch = getattr(options, 'docs_branch', 'gh-pages') repo = getattr(options, 'git_repo', 'git@github.com:paver/paver.git') try: safe_clone = path(mkdtemp(prefix='paver-clone-')) docs_repo = path(mkdtemp(prefix='paver-docs-')) fd, git = mkstemp(prefix='tmp-git-ssh-') # TODO: I strongly believe there have to be better way to provide custom # identity file for git, but cannot find one...so, workaround f = os.fdopen(fd, 'w') f.writelines(["#!/bin/sh", os.linesep, "ssh%s $*" % (" -i "+options.deploy_key if getattr(options, "deploy_key", None) else "")]) f.close() os.chmod(git, int('777', 8)) safe_clone.chdir() sh('git init') check_call(['git', 'remote', 'add', '-t', branch, '-f', 'origin', 'file://'+str(current_repo)], env={"GIT_SSH" : git}) check_call(['git', 'checkout', branch], env={"GIT_SSH" : git}) check_call(['python', os.path.join(str(current_repo), "distutils_scripts", "paver"), 'html'], env={ 'PYTHONPATH' : os.path.join(str(current_repo)) }) docs_repo.chdir() sh('git init') check_call(['git', 'remote', 'add', '-t', docs_branch, '-f', 'origin', repo], env={"GIT_SSH" : git}) check_call(['git', 'checkout', docs_branch], env={"GIT_SSH" : git}) check_call(['rsync', '-av', os.path.join(str(safe_clone), 'paver', 'docs')+'/', str(docs_repo)]) sh('git add *') #TODO: '...from revision abc' try: check_call(['git', 'commit', '-a', '-m', "Commit auto-generated documentation"]) except CalledProcessError: # usually 'working directory clean' pass else: check_call(['git', 'push', 'origin', '%s:%s' % (docs_branch, docs_branch)], env={"GIT_SSH" : git}) finally: safe_clone.rmtree_p() docs_repo.rmtree_p() os.remove(git) @task def release(): """ Release new version of Paver """ # To avoid dirty workdirs and various artifacts, offload complete environment # to temporary directory located outside of current worktree import os from subprocess import check_call, CalledProcessError from tempfile import mkdtemp, mkstemp release_clone = path(mkdtemp(prefix='paver-release-')) current_repo = path(os.curdir).abspath() branch = getattr(options, 'branch', 'master') # clone current branch to temporary directory try: release_clone.chdir() sh('git init') check_call(['git', 'remote', 'add', '-t', branch, '-f', 'origin', 'file://'+str(current_repo)]) check_call(['git', 'checkout', '-b', branch, "origin/%s" % branch]) # install release requirements to be sure we are generating everything properly sh('pip install -r release-requirements.txt') # build documentation sh('paver html') # create source directory sh('paver sdist') # create source directory and upload it to PyPI sh('paver sdist upload') # also upload sphinx documentation sh('paver upload_sphinx --upload-dir=paver/docs') finally: release_clone.rmtree_p() @task @consume_args def bump(args): import paver.version version = map(int, paver.version.VERSION.split('.')[0:3]) if len(args) > 0 and args[0] == 'major': version[1] += 1 else: version[2] += 1 version = map(str, version) module_content = "VERSION='%s'\n" % '.'.join(version) # bump version in paver with open(path('paver/version.py'), 'w') as f: f.write(module_content) # bump version in sphinx conf = [] with open(path('docs/source/conf.py'), 'r') as f: for line in f.readlines(): if line.startswith('version = '): line = "version = '%s'\n" % '.'.join(version[0:2]) elif line.startswith('release = '): line = "release = '%s'" % '.'.join(version[0:3]) conf.append(line) with open(path('docs/source/conf.py'), 'w') as f: f.writelines(conf) Paver-1.2.1/paver-minilib.zip0000644000175000017500000013261512152711214016234 0ustar almadalmad00000000000000PKBpaver/__init__.pyPKB ni paver/defaults.pyPN0 V;Te`dfaadH^ߓW8 {~~M< "$:.ep&c-`)PpwMBp91[ek+eT̐ɡw92 e.E 5IC9p jSPT]'K$@a6tyP'N@;v|g̏- ,n~ߨB:r(7m Rv<."ۛr/(_õp7߶>PKBpGpaver/release.pyTMk1|q&khH |L&i{wka#i\C^iY$#ca-l9 biu&͵B+3z ^=[lr(`摾J GaG0W}a6j+Rjxn ds pފE@0HHyKT3K>o,u~WZ,X&ӏG1ZFf+*P@/KB]/b_UZi¯ui%b@E+ȕp,%eRBAc%P>T^nY9BwmuGHQc>^gKQ"j\3.&N]Ix Fj;ۜǕjܗ6KxsMLZ;Eh9R,gVޛhV"ؒ}w伛20TiG6qznY]m-9V ^=H|״!M2̣c8 u2'zSلMvEhbUSQr p71Vo痳kwL೭RpC*u}.|uٷ˳C Z[>-0L|p(VɅ7peMF!Rx>ҿ"GΏ^w.<򍺫{\PKBB\L paver/path.pyVYo8 ~"E_H=fч4=֎,|$M['P%_\\pL8;zXLHɤ 0X@: pt"(kZg{y;LQB}z0(2M~fXV!sza,'`-G?2'v{^ % Cig:u*@{74Ua ŸI΅[$ra,?EqxZw+.R9 , )tְKfvà̑m(eQݚ'hNz0<(;zD:#4LY=E,N8Q{ wc~}3 4~\weE'N*z~ȳ2ozCO]bƶErN_:XGYV+5J*^'Il:\U 'ibRlh~>+$7Eh>A@ 5{&Tl((J0DFWD`Re Aל81%V) Kk` t8п 4JfX?48l G do :밇F-!HZǦ^D30iM@f׊ ( gsY8%OsG+E4ܱ G8b 7BrX ~E@'tATFQ}1mLvL0|uq;=:QΙg\zD606ul݉ *ET~BxZҝYҽ^5@[,KeLՑ;m>jnek yT>opWPKB4 #%paver/setuputils.py]] yϫ[r顽hLKW,)$^' Id'-ؕL ágٻZZ(VJuYWJcRTG? f(*m#5½5ʽ9Pr@ft[λQ5Jn;am!]>b! HxE;ZFz8#2L RJ(QYn`ْS,2D[i!ZّleY,iZXQ/S~'?w9\G2O=KQE͌ 0 9x](@Ә5ӏ`a'W;4^[~,RR%"RKd~㛻ݯ⹯)'j(|mx[{Y5W(h,2ߗRp4@dT`6V$9&xۊ`A=( QZڪ́"F5GJ\:$Ms`?57/ނ4"׍,"z? {9U/>Bwoo8]YoE! Vdjq2T`'A̍at`3yu^Quⁿ-}p ZlQU@nH Uɼ[^nGYeF[hk> |4{Ūr/{~DVOf/M N@&+bcSf3ikX3S D*e^[fmapQFjJUITO}rkh +X !QYUsW(Ɂ(>#" g ,pa~B6`AzHbd^ni{t}-7`h8h d=˪ rƤ5tkzH2 bsiom-wNS|.r+`)!yVӏ%GSɫz =J&?aiOJԪD(-ST;ph; a}2QAXY$~}PN>,F`) "gl"Rl+4`iLۦM>;fmTJpcbq}S։]d{wDzLUCdƋH& E| $AjNB&s\: 74!„(T_L?Of.O ]ͩ慚l^ %Ru5v?aӂkC: \=!A ܳYu%U/k'`dpTR"%Q^^&jʔ #0>2?c&-#ի)#\LTI'F<(u2fhV,_[+ X 53Vs5_ہ4)FQ^yo||vB_hAD]P;LBTaZ'tkp i0z58A8 PzR !lFQ !qkKmY708M7]AM'=Nj! zPuIYRAef[`D Q:ǚg T lPB߰Ȼwۖ;SD\p&q3F/P]]rfno'/DzMMM 7LA$P0\5ȚaGO:9RƜ[R\$ ;W3/k1s#J gJjDĝO~8҃`z:Jd8^Ϩ\!E/keܹ]!T.Ka{&XK'':+ؤ lxvp5[vf3.(Nzoq4a=ڰHLP(7L^0SPW  +\?Nj膿@5 @G0I Rq73EF\4F Qz!4N\bЖCCQt|?HT<0/{le%=xW@B _PPKB{ paver/misctasks.pyWmF_1Q Ms)m/G =![k{sVsJ{i!3{I,F4M yᄇT6dkVb 7hiwݙ"I[,odRw }lz# yIkm ̾ҢM7_cֵ#X19cWaΧ؍#я-7td{.\pl3|J^/<8(_bU17-OʨX#m"`A"0ɶEK]W[j=>gزլj~H*U( l&J}4l{&ث_И&Rzـ%-_c 3g>]`oV.Fu^A0R[,^?l\Z0֏ۀ[u x3q!H O Dؠ;a2/w'Jl+dl>rZ ER ;-^0$Ӌ"S Iy YĨq lyzD,?Qfae9H%2ʦI̙رgn vQȣ1'Jup7Kn__H(CG $@cǢ}$Ji- qĿ~C1>q @r,g آ=;s ?<r_RCM\r.>g™Ru & /]hpv\Lr4CN4)?3|ۼs݅]_f+ah-࿱;o|w],^%DZ`Ę4#uh-N6b[G< ϶=T] ,dz8IÓ `M"CҊ'.Y$4TݽH Xlj?770+'MSWH F0&Lߴb8] 1MŀU %ñpU96m]hi~oX5-pN c c%cGav42 DPՈtOw8XHVNX6] 8um ?N<ږ޹TvI6(gHtj?19OJ8u34ڔ#]Ԣ.LOo%3RFvɁwX$>iGY 7-Atu&8X"q2ӿޒ1A [| R *<3]a\zkK; @1N5<.vq|8@}.FoU!S+0fTdi%xz AԹfl`5ʝYpg Y@<|xV%~&‰Sǡ6K#ֈ0BG)UƯ @Ph zIWC>#'%^V܃ s'>M\chet6fSq0lQ=CLھLdmdn|(B bI)g^z>y`I:K{ja%a׮]YBK.Q)Gu z\MOoc{Zt5&ոJOf9mO0=,o| n5љ+ڃ=g5ԙXj$Ƿy$'e-)X*do9Nd&v_iYBy"2zEt@}rqd4Z'D=栌-R ̗Uv^ ">K A&'G\uC6d)epϷN8=C@{=3MF考[P+d,}F,j$9mh2~7qdSb Gkh*2ħ׿II(V J`֜&D]Wb&%O+Wvoąi,^jjP2"Y?S%˱ֆT{E${ٱGy>(@f‘JG $v\ݾ }9C53yOBu}!$cE1y(20m xRd]`.:|58Y\IkGʜ>2UdH,l92 Atd݀ՂmoMl[ 6ƒjnɾʸR6?'EU׺Anicn8$6vywAcyG'Le謫O|_S!@Tl)0Ë~pŋcjvC v F{Qwmx}=8X| 9VpO{ ":6U=~Dl>B- ;"tYxd+ӆ׻)["_e #VQGJNeb2]q@ԞB3@HP`%z"| !td5|qaddh28^=hXY.MZrr6a(q]-l0͙673L MY #1@_yIof.Vs߃ZDy¸ޣ<" jL@X:EL18vqb<,,J0Kj n|TKJ+6-S(@;9k |)!8lnI2sȓ~-[aTwjsDzo#0s6AzP$Pq"t)yC`!=,˺ߖ65ǃdw+L&d /hWnJSeI!tbas4\rj,,sZHabܮSI-J,OÃI`x_Ϣ^R0B]|]_"S}]ת̫LeygkKl*ZF#i IoBpkruB$>OMӥsd\wV? WHwOcAT%ix\t<Ӑ>^l3mIevq@=U(v܀eeV=7jɉ<`“W 4P zRb.O9Hy^,cwռPs`|dѯM?A+#3?[}?:S?[edl=xg%fjJ1[XZ^/%0M7%fN>)7ȾTxlYK3wݗ,K#ӫ+ `,Swh03"1 ( ී'jhUX^? ]_#Z\1嚳d({CiH= =,f"QȪ9" 3LaP\rY\>¢0"n!qN3)sjiu/FoT4_"`W?p#.&?IPɳPs-ҽ۩9!JH%=lXN!XtCy`o4BJCm]zG|"Y< ݑxT{R(4v-e*C(s8&J'LRYM9{Qε@ßW8'N`f?'<Dis~Ωot^M'+}PHbu?\k?1=z}J5㾜~f:޲1Eovf7(Y \S!.:un9o xLR_gm1~]vz([]] 3~jP)kku RFpS gh?p0x&& 7pSB81+}(S_Ym#M^ 3*egL7w9Wۅtٮ/ՆD}]pN&iM`@3["2G3ﺧm4תR bWʘPx C}gGP ΉrҔ/6L>^wEk n}wa.z6a0Mr q},ҥ?|c.:}d.̣Bҫ |33/^Fc^NeK$.gj8ZYAØL8'Śy#5Ջ(2ܑ~Cq|+u/2][9\s#ksS^M qhџˊF.z4,cqE;]'z~}sW5oqչ!!9MR??]XyJ=)Ћ<[Ph)rdv!H. 8J]8 t_^$vscH2 T}EtKz3jzVjUx ~ exlD;v jb(|miq#,=i6]=@МT[(-J[dKW2 $BFL0'A˞>76fU6=SPhZQwa$55\7~At"2N0*J"U^#FtFsqQdRi,GD^޲S*";=PT Y`CnhBw4A92M 쇠52[TVPz#TTuoE]D2*qnrWH_I,WJʅo}e0LXIdI4A%1U 3l;-ɿWq5ʖgBJ\6aETOC[&$]oӸ܏szkVgd5w~wr䄛?jGݠ'&lkxO"sLZ~$,dCTM7c(mA< ц&ޅ50mWVv2Q&\Cewuw7rd"Ev69ykkB7Ahsi|gvHi\A5%5MLn6jt^JC̦A,HGW!R(k''cEme }? vcBK!7%}pep*V[Y{ GEsaa̕Ycj~b iJnQUOM OբdrwKu^m- `N{LKACk?djY^2:) 5Rd=1 ӷ7oj6TŪL }%kr $qv.,4kɸ ˫n2JJ&랩KqU=XnN2vn+>yQ;̝%Ty[nvDS^ĺ,FT^ٔhƽWE6ƨ@z8]9KCЫyR&U %'*GIl''V8HwMi{ QՈ3$gJA?简;${X{+nR }ވA^px*ST !0iGZvHnxwr_;sӼƓ +E^#?b@ׄI TH!;SK*C?[Wƪm^x#CSl;{^٢S940))#(̮O-Ne?]FZU3%2TQrYuDQ}r<$mҜB<٨IV<6Yh?7gElozs5N]՝7o44G Vv<%^y_Vmj`I~T@n04QCFk5q歏.ds?C9J>Z;#ž t(6*2$홬+-͡ <` ,-~AIޟ}lΠ_ c0sG)fz'wᴕס[*wYt级̤LN2W,_iWj){,Buy?s#gO6]mn41җuX7u!{ZG3P{mqlE .6!E;7 kOcz<@!X!ɝ0/Vi\]e},h"% ~#(49Yʉ"l: _7[D~ D  w'tV&DF;V!%,kq*۾wW2?ݥ=*t߸ASR'[z: q{KKsjb\6/4u>4h֞ێe:z}jޢuWy~.>@dX;.cO毙}7 f6ۉǕ]\J*'p "xngF.2FqR)Nr3_wRuT=O虣GX%0G / ):LOh@jkZq+CMjAE'8]@隶ٰE8l+F8Yrp҅ mj\hm NE] EN7ԛSr ?n85'@hyBMrye Wyx#?Cvew"E[#x70F}ؽ~:a=wƻB?.^E-s*{YGY`Y?` z6Êk _nܽhծ_TQ^33X|Q BY>}E;cwPӥUKb WZǴPKBp paver/easy.pyWˎ6+@U0" M;hRED[ȤBR8E璔Dy P/d>}ν[SKJch͙QZ^^h)𣱑]J$镦h7w^f7捩ͯzVIa"gc"(j_?}#W[.a-OyAD-w{-6vU M5#y. y{J ?R>I͇)|/ xϞ퀄0ZgD煩`ꎆF'rݙߘԟUJt+mjȭxh\eU%6PۭK4FO Ut=xݢ9vȍ[%}X$vٳgk.|.y%Ӂx'er7T*"{^beg")\rEU2Y!gb:[9U.l-(A>$K[)tn5@e>BBXDeO 82 {%,EKwZ XF)K2P'<_UeU$S2Jt#8MJW%E'3+ip$MP *xXḛ́ /D)SD `$=bH%R*<_I٪Ƞ[IHG*>黆h4$,cbiX(MD*A@U8Abi}!#b$._>+'wtk5.ί߈Prtu%..Wg#xzz~|vsrzZ_\ӗTNGW<@=?>G/.őxuty}z|svt)^\ '%3z9:_x&FvЎn` 8x<~>qg0㳣ӗCqr88B8/Fν](hU ieJ].'Q)zUjJgcTr d>V=5£JMgKP 6 -|9@m߆u%H o2y&+Z 1;n`;f(H0  :TPzi{`כ0lq ({K\pM(DrUbRRUX!dB=GAThǁ!W0yhd*Py'5xYF(4sGb_\pJ<) X@>` *_@|Ŝ-tgGqu"ӸTEs ZttV%T (GizṪ(*LVΊ{L,7,I!ïy9-SC1+=!KJWW>e2[p%˃ VdhMe Ů*"Bd1Ca~f?mѧd4_g:Q^Z`0c[wsX>>YtȞA+>nei 6Dd/CXtzoFTl*Xjrzr;5yiO-AilG/R4!_ ^B&%Ζ9sׂ3"#.^Fw*` 3XIPT1c9%\c<4aN/?CW)Lkcp^iYK&!0+N•mvG1Z@pM;wKѤ$6c^i8e oj`TV XP𪔅l3z:QQ>mbg$zM,$ P!M5-.TFX-EEd-Bq::v`T\Uh$uHEkE|igF1v evUxِfnvae[W2#2 X|6+6X ,堎68gǓ:u`Cy t\_NAw;h"JXuuvļ=$Nqc38NP!Veql_e Bak`ࢦǾsb46u 2Y je>iwKͱyly%vLxi` IGKXleN8I7=JHB!a>dx0h lPb>E<%NWκ;S ySw A`;~XEuGk j4gAueB*C$Z m@YmZ,G}LNIN"! bkX)…+lKFd6rɒU+t>O$Eg 6$]9X:V.'h@QC?"Z3}.pCad$S)gAޢgih ,Hae]Z Qk19hlT d0m3Cjuy-ZD͖E]nhʍV3R[U$ꭲiZgyNC/1w@CyZrⱻvjUr0jupݜr2O2rkE+:uB>:X,ʰL@H+{0!1]D !@yGEwel%BƝ#J<v,HVxzY:3|%K0r}QT.( b  0̙UDPy#ݵ\!wV㢄3~?s NLnEQ}=bok6PP}ouF>U7~ phD*>dz+}Y *y5ky5k E.IF!dqZn@ qC5Qeg3Q24v.3hUhbتcq03 x*ԫA V2FdTc鹥Y$ڒk4ILdf=}_'YߗB!+M('M<;40MWSكѤ:˩ӊ>Tmth?'Zx R+(}0ءF` E 3` 5HG!%-ŞHP|<2ɞho%kW=xbJj&,8ܟY-F(vVwtoPy Lc;Rj hbRʰQ~ciҷt-~<{r)++Ή,^`LG,0/*0c0Ν$Ь=вԶc#I7lsC2-b:QzG_PRl!T;Y䞀%['J~Й'Ӎob'*jv .wܵ0:L:_4b Q_W**WY"˺˛&W-^6H610H̽DM(@[iY%$%VK&3MpSk܄˷ 뼊 4}zlRoIU(iF{ e|ol&QSpAE6Ad `@w(Ny?X,fbæNA+03IL|o.e)$YJqSͰTs22"ar'L7tZO@ eaAcF!M(H2?`ӻk6Js'FMI뮮a<+P 34\/'뛼KY`R*L\V}"RهmU!f8BBzh"gJT}DF~Dy ĝ\iị́ P8:TS$ra#LFdѣFF`^{ʏU1P%`ұ%q8PD&?9/z=HnĕAe*Z[uB=i+J`Q^I!bj!WHssXo45bYðWvµib7x-}67) O˚WeL|UJ(ـ0L~~0lmPˋ6̺KqxfŘЭBeU>opuUrvWRFPnw#UƎ|x?Dө,-|̂ ?5"P3l<h8aj0wS*UE]4`Xk<nt t805zT;R8Z32W-6?whę:BJbE&C60|T&4O1lO6y$FfZIiCGK;]|V|Q*[>+/W-5ck8M^E-ߟ谤;l^]F/:mc3nlY2$[m>~v27 V1T$| O`|b! T*L=Ҿ|NJp7N e[h4G6)O?$}FE\3ҡZwMތy2d:X۠#N}npnX#pY cPB ci6LXRDdB` _p: hjjA]h9kOSf]*iS.rl4Ԩr*!64qAN (8 A[u;#[|HecBj@*~MNӏҧڣ=ֽS˟4I0x3 "zE'{&hI .vnw.=<(Y=xW( :t]ҪAbB@QVtqR27qQwBSRDQs-e5pLh|uУ?f`X?z;9*rBvI`L?@~h/{:LR|*^K+"d|Ki2&ٳpI33i*㧞Ay#j`w7ڶ\,C~@{ JŮ4cfs`* ["X .z nbS}ًn> w K7g ZTWb~?|0ȫO`7#Y+:Yb#Q<ک9IIXK`U;uUIWy̠-q("̇ɝFսd:ԣ3\sx3sM I/b#C+}@Md;hW X}D}ZNЄHYƖ]Ԍ5}sJ ڎ ĆZ%|g :ƅkq&!)Eu%@+U ;k:28[ckmJY]M%^)|}5v0! +1F@Vݚڏ*2 =D? MR};c[kukT j=RaPx)-I|W}\t/ٳуA#IR4} 4EGAz,':^\w<;dihDQYB,hAit 8(Nnҽ BpDޒ$y.~=f\4]HRlyHZ,\$f"Mwb821۳tU9>IiŽ?,HPƦҘJ*9^'%o8Jΰ Uڢ@1jeW-&P6m"-kC5hNa֭8`E,w c/"-:]V򤫪uR6^ן>MDzop~UspZXؽqkI["_`/q>; q8iL ݌Yv+AXbEfN5K~5vm|iKIc6F>RS\@_&دѪ3?x1hYM$ڰ՝azŇ PkÛ|R?uuRdo?oe8XԜ.^ u\ޞz*eSTֶlZpCA,9olܧ<1Em oZ!u[d%0+qDoNl͓<3GcTԬÏ 5D?lF_݈S#Hbg)~VA}: E:Hw8E{;S|1)ϗ9?4f3<6gh[Pj]Q9;5{k/ieÍ3œσrg͐ Vt#q) 2G $ nQkytm~V;N?}I]㓘SG~qγ;+SwӝlZ>/dC|;x[f-cFlk8J+m$OU."nVKg6,B{_^KOٜƯt'{ICPY&˴oMM {l7Hq;4o=~q_]X&19~t'H@  ,(TCEz)U,V#}]i{x_ӆ͎/u֙'r-?ȕ֦56 ~C;81|{pyq0m?ݠpf %XqW9HJM;u s%kM[汰j z/ڲjwf2fƐ,%WؔN&*7ۮͷ^xV+m'tS.=Tmq]5R-\7ּF6{}e;dɃX mŝTN=uܥ&A@5AruTP4% x-} G^]omFꡣtՁ5G(' WGXu5oz%5JS7=al;̣ T`W CFthW= &=TM6tۻkXes5PϻLi 4f]Ц>Qǟ0.kk-xhR"?B_ЧIauiCqC>v`K1~y~>/.eB]"n.r',YN8vZAYti51[~:5=:|ڶ:ɑqj3kPKB1I#paver/deps/path3.py=kwƱ+P6MVX,Hr]ۇ$""`2s'$ei>'H`wvfvv^;X<='jS$7Jg7ŋv%y]FE2)$DR,t#n(d<BJl7r(\DFdQB|ZEId7"3Aj|^E汈2%@q>[/eVE8ORY~J80Rd.,"!!4зd1;px]P,8_Iĭ4)C'|bg2^@ˣL5DŐZ8+dlXU╻EI`XIXG"g^;yu~|)^|9 %3z1a\&F9Ў_ 8|syk||~:?G<vr~|b(N_<^cbCQ~>‹81wr}6@bNחs^^ίϮFCq|yvlyv9~d"cϘ@ϋAsM)NG ;39Nn@j6P', d^؄i8)]^l^o d Gg'2b>?\_xOo}|"g/I 2?yf| 3YFLOh U #s5QF*O{y˕J(#rnI?&Y0́9.8$ۂ` y8[?o5.Mv_k`W)^n?xY,B|_a5sm-j?o|j/U_<3m41MeQdy7|%2'~ <,Wr̓(#w,z h)̪yTMeI)g"6tS~U%(Hk ]ɴ`tHQ q |%NZHZ{iT,Kor#&AYCRˉ<1-b.\s"R͡o٥./naI~hb) }3*KP@d.M29ӛTcD P0@#?LI L"@ڃY5b^ nzY Tkg^Gk^9}w2['檛/+XI3T}I,%D$+i4ᩛa"r"Z <qxx(p80TC,b2A =[CТUPЃDZɛ, b4.խ9c}B:{A.\h<M%rכ9DQ`|WgqVdlioVGg9$=i7%-/6I NL./VDjQswmFՀG"1c+~)ҝeiCJ!SK\*UMT@=D$xg:-G.g +k-5Ba\` LJpiCWPdVpd~=Sk)pP 4hL&x؁rΌq߲Z<1f޷ ] Ǥ2p@!jYZfY+ [E1>|ZeO45L\45|Qφ4d<&WFӒČYx]R Tj;$nPmX)łW!B.`Aջԁ}l $ LBBY#o}"9IeJ N7b^3.бntԜȍB')~@C.,ݠ.*"xր͚x80Ldf]ؼ̐?neR ʭ`IO]N,^; ]:VWsPGFNȓim:~ t\K[Nv;wX"jF+ěZjӷl)"QzGAYI[(Jo~T)oZ  &3ă;^l9sS_"6r%-6$,})! Ih1v{X䳟|f#{EUF Nhq  :Y6-LwOyE/L'G)uy5NXԯŔΩVfפj jW3rʷը)v;LtT'K"vlޙ^~KmrL=0vPzdVf=mc9x:-A^]%f(*O2[u* NSN23R銨Lr`bfp$`E((pEB;3!έ%n! lh,K$҄ ^;nӏ~ f:Kx72)ӷl4ʊE\!K&U&dLb;`hwsW ~һwI QI,Pj= {Q z/җۚ\9o[T\[8\"g/2*ۺ]༖ 7g ?$",^=[Suȸag3Q24~.3Ubؚcq4C\ U^Ϡ7pic'.f)qAя,wm Z$&o2Nsɑ>W\,J%v׌ihrMhE)6O:ZSt+BeT&CsiNG:#X~n,_7kA~ N"ČҷJbAx %'4#0;FZV\\[ zXM'7_U9-nV>'_o\r/;(w6zc6q8=\c)80pfrYE<|>ףe3g@!50EpIE201O+FE Y2G{WJq\ݐBuIdu:b^15Wu$}'fMDuwv8If-s ѶقE-}AJ-*iɢ\=ٚ> uSΕg֏nݒ 8vjz跜~ZLl5k#Ee q#nr=Ճ%Ƿ)k*HEe$+Ttz!SHf"/9Z2 M X}.$d \UUhҤ%d7te3 zKr'P7`VNh5_dlK :kDrk|bKu슸X8c%) C;14z8CFBRZ4II ٙ_^{L^ K:/3-3*,&=L9f}"Po b%b^G}4ɸ>#_R4r训̚ɝPmF7a0NDMJ430:h=1hjodE2rU-9H)IcWt|lo<CS9T #Du)rUl"OK>$XCPSWϐ*ԇَ ѓ:ĈRz DX4P%`E%UQr:PDx6/z=HnŕAe.Z[Bh+J`QµAI!bj)AQ-Gssh845fYñWvµr7͞>[4 SRV4~G'W[F1"գ|uI"[e2dי]A~JӉ4t[DbtՔzĵT)EYZg2X#~rUSLÝVYn*ITF'Ruz9qd\r'wokz8S&?]ff3>M s'Q0J5>Vqu,Rѡ8Ey"); dqϸWJ/oM՚TC*V6zC5>ɶKu6ՓGf_6ܰƄ(AHiGb16 s̥ٔ2KUi.Bhc,-9xOQ>bɨ'#sou7 ?ҟ 0,T >Q3J&|((.xk2gt?VtSɲl)c!\}iK45 p]hyr>M>7ꢴxҜhw KPʥ8G_J%Y2h"=-tJ&}QǺȏoe W)* 7E;]?n3H?MM[9Icy霴9L.l ♠&PLZ ?x0/`;gFPAfY0pRvz#m˅n%cX4a$ؕfܬE PU`auYXSk!BY+݇|=X1͙~Vi4}^CZ.~[>PO?^nX?GVvY *Mk$fq2. Zc)FsUp;/B{t$/?ı>fB7Z"GZZ,+ەA6ʅiB3Rg%> Z]iRq=?գO% ROOMCóvK'>121,yvJePP+WU5RׅX3@4pQ%4ݔ{π EeKUXg˦ɭBrHPΐ;Ѻd"n(-j 3#gk<_/CwD0)P⃺s&iÊy",&+dwP7a5[dX֖~m] }ϠT8]Ӧ'/;{:@9Ƀ' 7jHNW<9NPO_r9ަI )VKsz'G7mLjlZ8Ĝ5)\{R-/q8l'R )6+`c˾Wif~40d3NIi/BwB!,^̓X^΢cYğ=f.q#*n?KhDZW-ƨ91 }q/~L#ָY}[*PH{4ۢ3Z`':3;u։^5n%JdN^E{V=vL.'R׽RnHӑp|?==I0σ< bt㢒c ~LZ*Isy7c6L?˳CEрBF; W+'- -*:Ɖ%ۙ)v>cΑP7籙O%3=G~؂R+L(។;8XK"//Ut0#wO)k\eӪ7?7IAC>ߚic?˲ښ]5n6g@'~H5A#uN'yܒCZDc-Ng,ҍZ3@ްK]N* Pcvi33=x+L5Υnq4LDMbAqpE MuwA8@\^D7g VY@EBK\^Y(K;|/zfrPYng0@k+V{h!4RON.@2΀v|Uckts:QzZ:㨊9m[$H>KD{ ߅c jN-+䣌 zSXtx%RYKIXl\$=!vsܡƃqe&վY|8LhoEwhOc$|ã؁;sH)G&7r,EӒ?o2C2su:tƹgmG39eHnOOtu7o;{؛N:qswY dY:bz)uWqc%r;ffm-wcvH/} nsa\DjDgI"fMQE\&nޥ>xWֲWb  ճDB, ļ5Fť6·+Rdw:^Ryj8i|l|UGXàhWueh;{6]c΄5 g9_K@`9dm5l6.hKvj=`W fƲy.\YgXN/.޽BY79ſ.H܀ₖ; E<̮79WuLy@3',zOC!OC8d<־7rQWw7lrr5:yuyvfrvl|X&18qHV1ɍ!H2Jj*cq1J>.5<`xkG %Ż&z<֙&q?ƕf> K n  96}˶[_cn1H‡ymr7u$6WM:\4-t]QhP{5CXG͏\rtpJY]"mJ}KnV:34*W*޲=F)?UL6׉},SAv cUl6+*pn/3s06^1[s۰LPiK^e/uBPۻ >nW>+j=`~75<ڶ>)7;Eպot?PKB?~Z )paver/deps/six.py]۸ݿUp:mChm{m-6 ZeQGRu Ie6"Ig3IJZ) [)vrt[jvdIfr(mjV07{v39oZ9`+Q[ ,KdžvY(Cdwvtgoav[Z5J݋y]@E"'vqAg @HdemZs(*nLn݊{Kˎ -e>.M/?k/EDeĤTKn[.EXu6!cJBY\"فm-'$G}+.ښi$s'w"a-ΟkkVo !M؋,cؙ7czekX U[~'OR2E_sfd!UϢWJFT[Ceݢ/Dc/J^k hx}G|١b ,R骭9 䂗e VԖ[5<g L PHg`FUe[[srVUWKhgm;88_?SEfoZZs5P?bɀ/dQjab!iZi3Y!701Xsl- S4]ִ\}t>"9zndo՝(ߺ U Cx[bI#Nlq 'h 8a#RL*_ LNWjDeo.Д/$kMdKu\$n:mn㯶8|깷i#w8{@ :G rք =A:T#v)V8fձ:O5`z^촍•Ey<ʊI]1ₛ.壿C)K*V 1 HU,r>jI|>|Z*e 벦q/Y7Ef.-oN -h''8- ɎPƧ1:#멽b{$78|~?E cqn\7\(4vifŚ9nmBv8'^8'Gʡ;V4CnVQ&e~yu7#渙dܨ~~/px7qՐ`!!ĪѮSk)eq1 7"-S(Z48FaM/;nJ7~x-/%EvY!+Tx_&MIt̽tbh=}r\=E 5H_W.AQbUuVOmQflv?Jޭt#@ht+kT޺+5Zc?݃ LR`4uHxuN2C4Ʀ5}WQu:'vE,C\\LhAb',B7q˙v`'WRoE5'1)%x)C m픿mj;Ѡz]guUըuC#rH*}% xޘ҈fiR7:a0z={*ͱ.ŞrN#("Z Gs@¤8q '8~&Zrč"AhD*rK)MIE1M S:Jګ5u;^Pavk.Mi&fLT#OAخkj2/FW_ ^U|  \xOѿ |o]C -! [<oԍsa ވ `[qcE^.-貈*r׊Uo |v^С(-n?`-֢' 9lH0VB,yo(pZAF^No{.nriB"9ٺRKC*UZ`׀%|r*yMw[M7W=b+pȋUs^lo1 4J:ֳ$\)?;3QN}E̐s)kGsT3cPM;4M9F5n%COɥAш䖏.^AXH#R8yˎ c9fցvƊI: BF5P"V}$ H@t9Hqdb ZO\_%ݶ Qgu9\P@sD|֜X>Rs&N5,)]2 ulHP0ِ-+9(^S=Иsʘ1h[j7DžtQ:SNF?`ɩ,$'0l•&\9vprBpPaLi-(+Y|ZTJSsPi%"{g##/?K8dT~\# Mމ@H;_fPKByJ-6paver/doctools.py[m~b(t+8vc4@Q*Y ;oF Dѓv+~4WSezCC__|[gN Wv0>*S vX0Hkje,a1MgFUquӂuoHHf:XL#}oOqG@1_|֪47Fش׺iُ,-[ # ΄A_   ^7zJEdj Jlg:Z7ACi`> b䝊VF~QQxm8J? fސ Ipj<~?PhЖt|J |H!:?T&yfd;x /1v2yeGP@FW3[bAp|;9]=}ګ7em$hvZrf@Rx"l7ăæZHFТx)xPVBGwwww(ȖV' C\]ҨED~VǮֹdqw&Dsy1 >ԱmNP@+ \:S#4PfuDfR 2EьtX= #"P4( rMa*i%GI\-+zD@ ltd_ī^Ru] h P,d ZOn^d+B ! &jp3V`*D6.F>¹UDnT0zg":]Sb8m !|fTN>WRϹl5SPJDds>6(&:gdYrhDճS${Xh|2, ѣq7SE$ӄیibDmEGȠѓ8+]~J 'B:Cȧ16$EpLj65NԎՊi sO~<>{w’"e\Y:ҳɈ9_QY.y-xkI2=yR wV&dKNA f{s]RyQ041C>1Ƀ=7n ¿<'uyੌ>tbeՙW4|ux6qI9G؍^S|d#"dU،.)Si% L&)͐$cg t,Mrs̟"VäTJ*Է0.v}fWgjXXRLzlZx]kE$WS1]Ģ D4$y!*A$唯J/I7EF:8Wo0/~ s'5"L4cȄf4aO˫Z6=fCub6W$b᭞$~I0dQGHseX<RAxӇX҅S`NУ H'W-'w J5tdI^_:a}D§u5#Ha8 eU]pwH(]*,%YD9 󬒅WXxbj]RIfSMKKe&BiܡX d~&sc$^V8SYHbrӪT9jxBO'>yEd߿RF"DNԅr*x"EWum3e"sUOrƸMa&R'DڇY%|Lr';,@9dfҐtLo5¦}q(cAa8x5kZ?ϓn k#8WM(vlꏈ󁹴컆߈`Bq +uJ' fx0l5a$ l%n.^+Я E_? NoE-gB @~0:U`KA ",awG  _L VSxHiC5C8)d]ep 1Fiĝiz,M3. w-1b)My%BF؂mJ藍GZv*CiG@…N=Hcgq~~xHZo͋WY %/@VQXG?ʚET F|>,׫t*=#@XXr"`p m*Yyg400Ӡ.t "KY~#KHsC.<βW_~4)9%7!O] Nw[ admrfXX-6I4-[Wӻ= 1r1RoLnBU|֗i/Q"CEVĥ5u~x"P`{!m94{&Pf&B珯ܡ5_(yWdxK*-ԥM;80c.>jC´[^)UVfpQ):zeV$j4-3!ͩBtje rv3h83Avٴz+KڂٽM'eARhH~$eeH+ Js0CR)_Wٙ8,2 }_̏ 2 ` ~{">34 ։C݁ʧ]Ws[ˢ=#"gʌ>.v-hA:(xX?7;z܃3oE LiX-TFQGH&'|yyџ- Wk Y[lZt2rXa- PH6W2L/&410@okhu7P9)Șꁋ\h!xslVfc{g=M O?g|kƴL*rǔA %Q9+ZEm֎R$S.(܁hپ]^kQ9O8\X38B]ʔ@;T:jYHv/?gfWY@ɷ̡H>L+@P`#8(=By} &V+?_c:w 4qhY|e`BJ⋫M G80 4{9YYyfo9PD4D>nՅ 3)rÌxΜ"y/Izٕ}[^8x Œ$:}~1.&k'72I@ h<05{P L:ܧR47iLX '~ExR{}fPy޴^Cgy?,(PBܗFF4AnVsv. XEKbB>.fX$ޔSt4^\Rk/LG (EklM:~a~`k$^3<yxWPw9ԝS௝"207_||)d yøiq$)h%Hɟ$".bkt15fbά=yP;HessYc^ l10.ݣGuyxpJizFItXNĶ;<̆P.?i#,f2` `Xܘiإȗq[y;&'Anv`Ō q%,3Rr1*PKBpaver/__init__.pyPKB ni 1paver/defaults.pyPKBpGgpaver/release.pyPKBB\L Xpaver/path.pyPKB4 #%paver/setuputils.pyPKB{ paver/misctasks.pyPKBrpaver/options.pyPKBSs1!paver/tasks.pyPKBp `?paver/easy.pyPKBDpaver/deps/__init__.pyPKB~#EDpaver/deps/path2.pyPKB1I#hpaver/deps/path3.pyPKB?~Z )fpaver/deps/six.pyPKByJ-6Wpaver/doctools.pyPKB Щpaver/virtual.pyPKȱPaver-1.2.1/distutils_scripts/0000755000175000017500000000000012152711214016535 5ustar almadalmad00000000000000Paver-1.2.1/distutils_scripts/paver0000644000175000017500000000007012152711177017602 0ustar almadalmad00000000000000#!/bin/env python from paver.tasks import main main() Paver-1.2.1/paver/0000755000175000017500000000000012152711214014057 5ustar almadalmad00000000000000Paver-1.2.1/paver/docs/0000755000175000017500000000000012152711214015007 5ustar almadalmad00000000000000Paver-1.2.1/paver/docs/paverstdlib.html0000644000175000017500000001323712152711213020221 0ustar almadalmad00000000000000 The Paver Standard Library — Paver 1.2.1 documentation Paver-1.2.1/paver/docs/foreword.html0000644000175000017500000002407012152711213017526 0ustar almadalmad00000000000000 Foreword: Why Paver? — Paver 1.2.1 documentation

Foreword: Why Paver?

Paver occupies a sweet spot in the python toolset, the design is sound, it’s easier than mud to work with at a basic level, and it has a nice grade of descent into more advanced things.

—David Eyk

I didn’t want to make a new build tool. Honestly. The main reason that I created Paver is...

The Declarative/Imperative Divide

When you solve the same problem repeatedly, patterns emerge and you’re able to easily see ways to reduce how much effort is involved in solving that problem. Often times, you’ll end up with a declarative solution. Python’s standard distutils is a declarative solution. In your call to the setup() function, you declare some metadata about your project and provide a list of the parts and you end up with a nice command line interface. That command line interface knows how to make redistributable tarballs (and eggs if you have setuptools), install the package, build C extensions and more.

zc.buildout does a similar thing for deployments. Declare the parts of your system and specify a recipe for each part (each recipe with its own collection of options) and you can build up a consistent system with one command.

These tools sound great, don’t they? They are great. As long as you don’t need to customize the capabilities they provide. For example, it’s not uncommon that you’ll need to move some file here, create some directory there, etc. Then what?

In an imperative system, you’d just add the few lines of code you need.

For distutils and zc.builout and other similar tools, the answer usually involves extra boilerplate surrounding the code in question and then installing that code somewhere. You basically have to create declarative syntax for something that is a one-off rather than a larger, well-understood problem. And, for distutils and zc.buildout, you have to use two entirely different mechanisms.

That’s Why Paver Is Here

Paver is set up to provide declarative handling of common tasks with as easy an escape hatch to imperative programming as possible (just add a function with a decorator in the same file). Your project-related configuration options are all together and all accessible to different parts of your build and deployment setup. And the language used for everything is Python, so you’re not left guessing how to do a for loop.

Of course, rebuilding the great infrastructure provided by tools like distutils makes no sense. So, Paver just uses distutils and other tools directly.

Paver also goes beyond just providing an extension mechanism for distutils. It adds a bunch of useful capabilities for things like working with files and directories, elegantly handling sample code for your documentation and building bootstrap scripts to allow your software to easily be installed in an isolated virtualenv.

I’m already using Paver for SitePen’s Support service user interface project and I use Paver to manage Paver itself! It’s been working out great for me, and it’s set up in such a way that whatever kind of scripting your project needs it should be pretty simple with Paver.

Making the Switch is Easy

Finally, I’ve put some time into making sure that moving a project from distutils to Paver is easy for everyone involved (people making the projects and people using the projects). Check out the Getting Started Guide to see an example of how a project moves from distutils to Paver (even maintaining the python setup.py install command that everyone’s used to!)

Thanks for reading!

Kevin Dangoor May 2008

Paver-1.2.1/paver/docs/changelog.html0000644000175000017500000007661312152711213017640 0ustar almadalmad00000000000000 Paver Changelog — Paver 1.2.1 documentation

Paver Changelog

1.2.1 (June 2, 2013)

  • Fixed most of the regressions from 1.2:
  • documentation was missing from tarball (github issue #95)
  • path.push missing in paver.easy (github issue #97, thanks to leonhandreke)
  • broken backward compatibility with python2.5 and custom tasks (github issue #94)
  • Variety of Python 3 problems (thanks to Afrever)
  • Ignore non-system-default characters when sh()ing command with bad output

1.2 (February 24, 2013)

  • *Python 3 support*, thanks to @rkuppe
  • pypy support now tested on Travis
  • pip now preferred over easy_install (github issue #81, thanks to pmcnr)
  • virtual.bootstrap enhancements: support for find-links, index-url, system-site-packages and distribute options (github issue #79, thanks to pmcnr)
  • new tasks.consume_nargs() decorator, similar to tasks.consume_args() but accepting an argument: the number of arguments that the decorated function will consume. If no argument is passed to consume_nargs decorator, all comand-line arguments will be consumed.

1.1.1 (August 25, 2012)

  • path.py fix for Jython compatibility (github issue #70, thanks to Arfrever)
  • bundled cog updated to version 2.2 for Jython compatibility
  • fixes regression for setuptools intallation (i.e. using –root parameter, github issue #71, thanks to Afrever for the report and yedpodtrzitko for the fix)
  • basic jython compatibility tested

1.1.0 (July 30, 2012)

  • Minilib is now imported only if full paver is not available (github issue #13)
  • Option instances may now be passed to @cmdopts (github issues #41 and #42, thanks to David Cramer)
  • --propagate-traceback option for debugging ``BuildFailure``s (github issue #43)
  • Fix misleading error message when non-task is passed to @needs (github issue #37)
  • @no_help to provide a way to hide task from paver help (github issue #36)
  • @might_call for more complex dependencies (see docs, not only github issue #16)
  • bundled path.py upgraded to patched version 2.2.2 (github issue #15)
  • correctly handle dependencies in install_requires directive for setup.py install command (github issue #49)
  • fix creating virtualenv (github issue #44)
  • fix virtualenv example in docs (github issue #48)
  • path.rename() do not call rename twice (github issue #47)
  • updated path.py to resolve issues with bounding os functions with CPython 2.7.3 (github issue #59, thanks to Pedro Romano)
  • minimal version of python raised to Python 2.5 (github issue #52)
  • always import + do not allow to overwrite basic tasks (eg. help) (github issue #58)
  • if virtualenv is not available, PaverImportError is raised instead of generic Exception (github issue #30)

1.0.5 (October 21, 2011)

  • Ability to share command line options between tasks (github issue #7)
  • Flush after print (github issue #17, thanks to Honza Kral)
  • Minilib is now compatible with zipimport (github issue #19, thanks to Piet Delport)
  • Auto task is now properly not called when target task is decorated with no_auto (github issue #4)

1.0.4 (January 16, 2011)

  • Fixed md5 deprecation warnings in the bundled cog (thanks to jszakmeister, issue #56)
  • Project moved to github
  • Fixed problems with negative command-line options for distutils (thanks to Nao Nakashima for bugreport, github issue #2)
  • Japanese translation moved to https://github.com/paver/paver-docs-jp
  • Tasks take cmdopts even from grandparents (thanks to aurelianito, github issue #4)
  • Task description is taken from the first sentence, where the end of the sentence is dot followed by alphanumeric character (google code bug #44). Description is also stripped now.

1.0.3 (June 1, 2010)

  • Fixed deadlock problem when there’s a lot of output from a subprocess (thanks to Jeremy Rossi)
  • Fixed unit tests (thanks to Elias Alma)

1.0.2 (March 8, 2010)

  • FIXED A command that outputs to stderr containing formatting directives (%s) or something that looks like one would cause an error. Thanks to disturbyte for the patch.
  • Tasks can take normal keyword arguments
  • Returns exit code 1 if any tasks fail
  • stderr is no longer swallowed up by sh() (issue #37, thanks to Marc Sibson for the patch)

1.0.1 (May 4, 2009)

This release was made possible by Adam Lowry who helped improve the code and reviewed committed many of the patches.

  • Fixed sending nonpositional arguments first with consume_args (issue #31).
  • Fixed use of setuputils without defining options.setup (issue #24).
  • Python 2.4 compatibility fixes (issue #28)
  • sh() failures are logged to stderr.
  • sh() accepts a cwd keyword argument (issue #29).
  • virtualenv bootstrap generation accepts no_site_packages, unzip_setuptools, and destination directory arguments in options.
  • Distutils config files were being ignored (issue #36) (thanks to Matthew Scott for the patch)
  • The exit code was 0 whenever the first task passes, even if later tasks fail (issue #35) (thanks to Matt for the patch)
  • Tasks can take normal keyword arguments (issue #33) (thanks to Chris Burroughs for the patch with test!)

1.0 (March 22, 2009)

  • If there is a task called “default”, it is run if Paver is run with no tasks listed on the command line.
  • The auto task is run, even if no tasks are specified on the command line.
  • distutils’ log output is now routed through Paver’s logging functions, which means that the output is now displayed once more (and is controlled via Paver’s command line arguments.)
  • The paver.setuputils.setup function will automatically call install_distutils_tasks. This makes it a very convenient way to upgrade from distutils/setuptools to Paver.
  • Nicer looking error when you run Paver with an unknown task name.
  • fix the md5 deprecation warning in paver.path for real (forgot to delete the offending import). Also fixed an import loop when you try to import paver.path.
  • Improved docs for 1.0
  • Paver now requires Sphinx 0.6 for the docs. In Paver’s conf.py for Sphinx, there is an autodoc Documenter for handling Paver Tasks properly.

1.0b1 (March 13, 2009)

  • added call_task to environment and paver.easy, so it should be easy to call distutils tasks, for example. (Normally, with Paver 1.0, you just call Paver tasks like normal functions.)
  • added setup() function to paver.setuputils that is a shortcut for setting options in options.setup. This means that you switch from distutils to Paver just by renaming the file and changing the import.
  • the -h command line argument and “help” task have been unified. You’ll get the same output regardless of which one you use.
  • the auto task is no longer called when you run the help task (issue #21). As part of this, a new “no_auto” decorator has been created so that any task can be marked as not requiring the auto behavior.
  • consume_args and PavementError are now included in paver.easy (thanks to Marc Sibson)
  • more methods in paver.path now check for existence or lack thereof and won’t fail as a result. (mkdir and makedirs both check that the directory does not exist, rmdir and rmtree check to be sure that it does.) This is because the goal is ultimately to create or remove something... paver just makes sure that it either exists or doesn’t.
  • fix md5 deprecation warning in paver.path (issue #22)

1.0a4 (March 6, 2009)

  • call_pavement would raise an exception if the pavement being called is in the current directory
  • the new paver.path25 module was missing from the paver-minilib.zip

1.0a3 (March 6, 2009)

  • Added automatic running of “auto” task. If there’s a task with the name “auto”, it is run automatically. Using this mechanism, you can write code that sets up the options any way you wish, and without using globals at all (because the auto task can be given options as a parameter).

  • When generating egg_info running “paver”, the full path to the Paver script was getting included in egg-info/SOURCES.txt. This causes installation problems on Windows, at the very least. Paver will now instead place the pavement that is being run in there. This likely has the beneficial side effect of not requiring a MANIFEST.in file just to include the pavement.

  • the options help provided via the cmdopts decorator now appears

  • pavements can now refer to __file__ to get their own filename. You can also just declare pavement_file as an argument to your task function, if you wish.

  • call_pavement now switches directories to the location of the pavement and then switches back when returning

  • if you try to run a function as a task, you’ll now get a more appropriate and descriptive BuildFailure, rather than an AttributeError

  • paver can now again run tasks even when there is no pavement present. any task accessible via paver.easy (which now also includes misctasks) will work.

  • added the pushd context manager (Python 2.5+). This will switch into another directory on the way in and then change back to the old directory on the way out. Suggested by Steve Howe, with the additional suggestion from Juergen Hermann to return the old directory:

    with pushd('newdirectory') as olddirectory:
        ...do something...
    

1.0a2 (February 26, 2009)

  • The bug that caused 1.0a1 to be recalled (distutils command options) has been fixed thanks to Greg Thornton.
  • If you provide an invalid long task name, you will no longer get an AttributeError. Thanks to Marc Sibson.
  • If a task has an uncaught exception, the debug-level output is displayed and Paver will exit with a return code of 1. No further tasks are executed. Thanks to Marc Sibson.
  • The version number is no longer displayed, so that you can reasonably pipe the output elsewhere. A new –version option will display the version as before.
  • Eliminate DeprecationWarnings in paver.ssh and paver.svn. Thanks to Marc Sibson.
  • The html task will always be defined now when you import paver.doctools but will yield a BuildFailure if Sphinx is not installed. Hopefully this will lead to clearer errors for people. Thanks to Marc Sibson.
  • The Getting Started Guide has been improved for 1.0. Additionally, the “newway” sample now has a MANIFEST.in which provides useful knowledge for people.

1.0a1 (January 28, 2009)

(note: 1.0a1 was recalled because it was unable to properly handle distutils command line options.)

  • COMPATIBILITY BREAK: paver.misctasks is no longer imported by default, even when using paver.easy
  • DEPRECATIONS: paver.runtime and paver.defaults have been deprecated. Watch the warnings for info on how to change to the new paver.easy module.
  • COMPATIBILITY WARNING: By default, the sh() function will now raise a BuildFailure exception if the return code of the process is non-zero. Passing ignore_error=True will switch back to the previous behavior. Thanks to Marc Sibson.
  • There is a new call_pavement function (automatically imported with from paver.easy import *) that can call another pavement file. The new pavement gets its own environment/options but runs in the same process.
  • You can now specify an alternate file to run rather than “pavement.py” using the -f or –file global option. Thanks to Marc Sibson.
  • Regardless of logging level, output for a task is captured. If there is a BuildFailure, then that captured output is displayed.
  • The new paver.tasks module encapsulates everything needed for running tasks in a file. The distutils ties have been reduced.
  • @needs now accepts a list of requirements in the form @needs(‘task1’, ‘task2’) (passing in a list still works as well)
  • Added paver.bzr (support for Bazaar-NG related operations), courtesy of Bryan Forbes.
  • The error() function is now exported, for logging of errors (thanks to Marc Sibson)
  • Added handy paver.svn.export function for exporting an svn repository revision (thanks to Marc Sibson)
  • The “scripts” directory has been renamed “distutils_scripts” to avoid name collision on Windows.

0.8.1 (June 2, 2008)

  • Fix bug in minilib on Windows (error in rmtree). Also simplifies the minilib implementation. Patch from Juergen Hermann.
  • Fix bug in virtualenv bootstrap generation (patches from Michael Greene and Juergen Hermann. Michael Greene’s is the one that was applied.)

0.8 (May 19, 2008)

  • Installation on Windows was broken due to a / at the end of the /paver/tests path in MANIFEST.in
  • Options can now be set on the command line using the syntax option.name=value. Options are set at the point in which they appear on the command line, so you can set one value before task1 and then another value before task2.
  • Option ordering can now take an explicit dictionary or Bunch added to the ordering. This allows you to put in new options without changing the global options dictionary and more closely resembles how options would be looked up in a buildout.
  • call_task now supports an optional “options” argument that allows you to pass in a dictionary or Bunch that is added to the front of the option search ordering.

0.7.3 (May 16, 2008)

  • Added include_markers parameter to the paver.doctools.Includer to display a nice comment with the name of the file and section. This can look more attractive than the raw cog. By default, this is turned off. Set options.cog.include_markers to an empty dictionary, and the default include markers will be used.
  • Added options.cog.delete_code to remove the generator code when cogging. Default: false
  • Paver 0.7.2 could not be installed by zc.buildout on the Mac due to a problem with the py2app command under that environment.
  • cog and tests were missing from shipped distributions (bug 229324, fixed with a patch from Krys Wilken.)
  • Added svn.checkup function that does a checkout or update. This is like an svn:externals that’s a bit more readable and easier to control, in my opinion.

0.7.2 (May 8, 2008)

  • Fixed Python 2.4 compatibility. The paver-minilib.zip file contained 2.5 .pyc files. .pyc files are not compatible between major Python versions. The new version contains .py files.

0.7.1 (May 8, 2008)

  • 0.7 had a broken paver-minilib.zip (missing misctasks.py, which is now part of the standard minilib)

0.7 (May 7, 2008)

Breaking changes:

  • “targets” have become “tasks”, because that name is a clearer description.
  • paver.sphinxdoc has been renamed paver.doctools

New features and changes:

  • runtime.OPTIONS is gone now. The old voodoo surrounding the options() function has been replaced with a distinctly non-magical __call__ = update in the Namespace class.
  • distutils.core.setup is now the command line driver
  • distutils/setuptools commands can be seamlessly intermingled with Tasks
  • tasks can have command line settable options via the cmdopts decorator. Additionally, they can use the consume_args decorator to collect up all command line arguments that come after the task name.
  • Two new tasks: cog and uncog. These run Ned Batchelder’s Cog code generator (included in the Paver package), by default against your Sphinx documentation. The idea is that you can keep your code samples in separate files (with unit tests and all) and incorporate them into your documentation files. Unlike the Sphinx include directives, using Cog lets you work on your documentation with the code samples in place.
  • paver.doctools.SectionedFile provides a convenient way to mark off sections of a file, usually for documentation purposes, so that those sections can be included in another documentation file.
  • paver.doctools.Includer knows how to look up SectionedFiles underneath a directory and to cache their sections.
  • options are now a “Namespace” object that will search the sections for values. By default, the namespace is searched starting with top-level items (preserving current behavior) followed by a section named the same as the task, followed by all of the other sections. The order can be changed by calling options.order.
  • option values that are callable will be called and that value returned. This is a simple way to provide lazy evaluation of options.
  • Added minilib task that creates a paver-minilib.zip file that can be used to distribute programs that use Paver for their builds so that setup.py will run even without Paver fully installed.
  • Added generate_setup task that creates a setup.py file that will actually run Paver. This will detect paver-minilib.zip if it’s present.
  • The “help” task has been greatly improved to provide a clearer picture of the tasks, options and commands available.
  • Add the ability to create virtualenv bootstrap scripts
  • The “help” property on tasks has changed to “description”
  • output is now directed through distutils.log
  • Ever improving docs, including a new Getting Started guide.
  • Changes to Paver’s bootstrap setup so that Paver no longer uses distutils for its bootstrapping.

There were no versions 0.5 and 0.6.

0.4 (April 22, 2008)

  • First public release.
  • Removes setuptools dependency
  • More docs
  • Paver can now be run even without a pavement.py file for commands like help and paverdocs
Paver-1.2.1/paver/docs/_sources/0000755000175000017500000000000012152711214016631 5ustar almadalmad00000000000000Paver-1.2.1/paver/docs/_sources/svn.txt0000644000175000017500000000016512152711177020212 0ustar almadalmad00000000000000.. _svn: Using with Subversion (paver.svn) ================================= .. automodule:: paver.svn :members:Paver-1.2.1/paver/docs/_sources/features.txt0000644000175000017500000000551612152711177021227 0ustar almadalmad00000000000000Paver's Features ================ .. _justpython: Files Are Just Python --------------------- Python has a very concise, readable syntax. There's no need to create some mini-language for describing your builds. Quite often it seems like these mini-languages are missing features that you need. By using Python as its syntax, you can always be sure that you can express whatever it is you need to do easily. A for loop is just a for loop:: for fn in ["f1.txt", "f2.txt", "f3.txt"]: p = path(fn) p.remove() .. _onefile: One File with One Syntax ------------------------ When putting together a Python project today, you get into a collection of tools to get the job done. distutils and setuptools are the standards for getting packages put together. zc.buildout and virtualenv are used for installation into isolated deployment environments. Sphinx provides a great way to document Python projects. To put together a total system, you need each of these parts. But they each have their own way of working. The goal with the :ref:`Paver Standard Library ` is to make the common tools have a more integrated feel, so you don't have to guess as much about how to get something done. As of today, Paver is tightly integrated with distutils and setuptools, and can easily work as a drop-in, more easily scriptable replacement for setup.py. .. _pathmodule: Easy file operations -------------------- Paver includes a customized version of Jason Orendorff's awesome path.py module. Operations on files and directories could hardly be easier, and the methods have been modified to support "dry run" behavior. .. _fivelines: Small bits of behavior take small amounts of work ------------------------------------------------- Imagine you need to do something that will take you 5 lines of Python code. With some of the tools that Paver augments, it'll take you a lot more effort than those 5 lines of code. You have to read about the API for making new commands or recipes or otherwise extending the package. The goal when using Paver is to have a five line change take about five lines to make. For example, let's say you need to perform some extra work when and 'sdist' is run. Good luck figuring out the best way to do that with distutils. With Paver, it's just:: @task def sdist(): # perform fancy file manipulations blah.blah.blah() # *now* run the sdist call_task("setuptools.command.sdist") .. _nodeps: Can Take Advantage of Libraries But Doesn't Require Them -------------------------------------------------------- The Paver Standard Library includes support for a lot of the common tools, but you don't necessarily need all of those tools, and certainly not on every project. Paver is designed to have no other requirements but to automatically take advantage of other tools when they're available. Paver-1.2.1/paver/docs/_sources/changelog.txt0000644000175000017500000004514612152711177021343 0ustar almadalmad00000000000000.. _changelog: Paver Changelog =============== 1.2.1 (June 2, 2013) ------------------------ * Fixed most of the regressions from 1.2: * documentation was missing from tarball (github `issue #95 `_) * path.push missing in paver.easy (github `issue #97 `_, thanks to leonhandreke) * broken backward compatibility with python2.5 and custom tasks (github `issue #94 `_) * Variety of Python 3 problems (thanks to `Afrever `_) * Ignore non-system-default characters when sh()ing command with bad output 1.2 (February 24, 2013) ------------------------ * ***Python 3 support***, thanks to `@rkuppe `_ * pypy support now tested on Travis * ``pip`` now preferred over easy_install (github `issue #81 `_, thanks to pmcnr) * ``virtual.bootstrap`` enhancements: support for ``find-links``, ``index-url``, ``system-site-packages`` and ``distribute`` options (github `issue #79 `_, thanks to pmcnr) * new :func:`tasks.consume_nargs` decorator, similar to :func:`tasks.consume_args` but accepting an argument: the number of arguments that the decorated function will consume. If no argument is passed to ``consume_nargs`` decorator, all comand-line arguments will be consumed. 1.1.1 (August 25, 2012) ------------------------ * path.py fix for Jython compatibility (github `issue #70 `_, thanks to Arfrever) * bundled cog updated to version 2.2 for Jython compatibility * fixes regression for setuptools intallation (i.e. using --root parameter, github `issue #71 `_, thanks to Afrever for the report and yedpodtrzitko for the fix) * basic jython compatibility tested 1.1.0 (July 30, 2012) ------------------------ * Minilib is now imported only if full paver is not available (github `issue #13 `_) * Option instances may now be passed to @cmdopts (github issues `#41 `_ and `#42 `_, thanks to David Cramer) * ``--propagate-traceback`` option for debugging ``BuildFailure``s (github issue `#43 `_) * Fix misleading error message when non-task is passed to ``@needs`` (github issue `#37 `_) * ``@no_help`` to provide a way to hide task from ``paver help`` (github issue `#36 `_) * ``@might_call`` for more complex dependencies (see docs, not only github issue `#16 `_) * bundled path.py upgraded to patched version 2.2.2 (github issue `#15 `_) * correctly handle dependencies in ``install_requires`` directive for `setup.py install` command (github issue `#49 `_) * fix creating virtualenv (github issue `#44 `_) * fix virtualenv example in docs (github issue `#48 `_) * path.rename() do not call rename twice (github issue `#47 `_) * updated path.py to resolve issues with bounding os functions with CPython 2.7.3 (github issue `#59 `_, thanks to Pedro Romano) * minimal version of python raised to Python 2.5 (github issue `#52 `_) * always import + do not allow to overwrite basic tasks (eg. help) (github issue `#58 `_) * if virtualenv is not available, PaverImportError is raised instead of generic Exception (github issue `#30 `_) 1.0.5 (October 21, 2011) ------------------------ * Ability to share command line options between tasks (github issue `#7 `_) * Flush after print (github issue `#17 `_, thanks to Honza Kral) * Minilib is now compatible with zipimport (github issue `#19 `_, thanks to Piet Delport) * Auto task is now properly not called when target task is decorated with no_auto (github issue `#4 `_) 1.0.4 (January 16, 2011) ------------------------ * Fixed md5 deprecation warnings in the bundled cog (thanks to jszakmeister, issue #56) * Project moved to github * Fixed problems with negative command-line options for distutils (thanks to Nao Nakashima for bugreport, github `issue #2 `_) * Japanese translation moved to `https://github.com/paver/paver-docs-jp `_ * Tasks take cmdopts even from grandparents (thanks to aurelianito, github issue #4) * Task description is taken from the first sentence, where the end of the sentence is dot followed by alphanumeric character (google code bug #44). Description is also stripped now. 1.0.3 (June 1, 2010) -------------------- * Fixed deadlock problem when there's a lot of output from a subprocess (thanks to Jeremy Rossi) * Fixed unit tests (thanks to Elias Alma) 1.0.2 (March 8, 2010) --------------------- * FIXED A command that outputs to stderr containing formatting directives (%s) or something that looks like one would cause an error. Thanks to disturbyte for the patch. * Tasks can take normal keyword arguments * Returns exit code 1 if any tasks fail * stderr is no longer swallowed up by sh() (issue #37, thanks to Marc Sibson for the patch) 1.0.1 (May 4, 2009) ------------------- This release was made possible by Adam Lowry who helped improve the code and reviewed committed many of the patches. * Fixed sending nonpositional arguments first with consume_args (issue #31). * Fixed use of setuputils without defining options.setup (issue #24). * Python 2.4 compatibility fixes (issue #28) * sh() failures are logged to stderr. * sh() accepts a cwd keyword argument (issue #29). * virtualenv bootstrap generation accepts no_site_packages, unzip_setuptools, and destination directory arguments in options. * Distutils config files were being ignored (issue #36) (thanks to Matthew Scott for the patch) * The exit code was 0 whenever the first task passes, even if later tasks fail (issue #35) (thanks to Matt for the patch) * Tasks can take normal keyword arguments (issue #33) (thanks to Chris Burroughs for the patch with test!) 1.0 (March 22, 2009) -------------------- * If there is a task called "default", it is run if Paver is run with no tasks listed on the command line. * The auto task is run, even if no tasks are specified on the command line. * distutils' log output is now routed through Paver's logging functions, which means that the output is now displayed once more (and is controlled via Paver's command line arguments.) * The paver.setuputils.setup function will automatically call install_distutils_tasks. This makes it a very convenient way to upgrade from distutils/setuptools to Paver. * Nicer looking error when you run Paver with an unknown task name. * fix the md5 deprecation warning in paver.path for real (forgot to delete the offending import). Also fixed an import loop when you try to import paver.path. * Improved docs for 1.0 * Paver now requires Sphinx 0.6 for the docs. In Paver's conf.py for Sphinx, there is an autodoc Documenter for handling Paver Tasks properly. 1.0b1 (March 13, 2009) ---------------------- * added call_task to environment and paver.easy, so it should be easy to call distutils tasks, for example. (Normally, with Paver 1.0, you just call Paver tasks like normal functions.) * added setup() function to paver.setuputils that is a shortcut for setting options in options.setup. This means that you switch from distutils to Paver just by renaming the file and changing the import. * the -h command line argument and "help" task have been unified. You'll get the same output regardless of which one you use. * the auto task is no longer called when you run the help task (issue #21). As part of this, a new "no_auto" decorator has been created so that any task can be marked as not requiring the auto behavior. * consume_args and PavementError are now included in paver.easy (thanks to Marc Sibson) * more methods in paver.path now check for existence or lack thereof and won't fail as a result. (mkdir and makedirs both check that the directory does not exist, rmdir and rmtree check to be sure that it does.) This is because the goal is ultimately to create or remove something... paver just makes sure that it either exists or doesn't. * fix md5 deprecation warning in paver.path (issue #22) 1.0a4 (March 6, 2009) --------------------- * call_pavement would raise an exception if the pavement being called is in the current directory * the new paver.path25 module was missing from the paver-minilib.zip 1.0a3 (March 6, 2009) --------------------- * Added automatic running of "auto" task. If there's a task with the name "auto", it is run automatically. Using this mechanism, you can write code that sets up the options any way you wish, and without using globals at all (because the auto task can be given options as a parameter). * When generating egg_info running "paver", the full path to the Paver script was getting included in egg-info/SOURCES.txt. This causes installation problems on Windows, at the very least. Paver will now instead place the pavement that is being run in there. This likely has the beneficial side effect of not requiring a MANIFEST.in file just to include the pavement. * the options help provided via the cmdopts decorator now appears * pavements can now refer to __file__ to get their own filename. You can also just declare pavement_file as an argument to your task function, if you wish. * call_pavement now switches directories to the location of the pavement and then switches back when returning * if you try to run a function as a task, you'll now get a more appropriate and descriptive BuildFailure, rather than an AttributeError * paver can now again run tasks even when there is no pavement present. any task accessible via paver.easy (which now also includes misctasks) will work. * added the pushd context manager (Python 2.5+). This will switch into another directory on the way in and then change back to the old directory on the way out. Suggested by Steve Howe, with the additional suggestion from Juergen Hermann to return the old directory:: with pushd('newdirectory') as olddirectory: ...do something... 1.0a2 (February 26, 2009) ------------------------- * The bug that caused 1.0a1 to be recalled (distutils command options) has been fixed thanks to Greg Thornton. * If you provide an invalid long task name, you will no longer get an AttributeError. Thanks to Marc Sibson. * If a task has an uncaught exception, the debug-level output is displayed *and* Paver will exit with a return code of 1. No further tasks are executed. Thanks to Marc Sibson. * The version number is no longer displayed, so that you can reasonably pipe the output elsewhere. A new --version option will display the version as before. * Eliminate DeprecationWarnings in paver.ssh and paver.svn. Thanks to Marc Sibson. * The html task will always be defined now when you import paver.doctools but will yield a BuildFailure if Sphinx is not installed. Hopefully this will lead to clearer errors for people. Thanks to Marc Sibson. * The Getting Started Guide has been improved for 1.0. Additionally, the "newway" sample now has a MANIFEST.in which provides useful knowledge for people. 1.0a1 (January 28, 2009) ------------------------ (note: 1.0a1 was recalled because it was unable to properly handle distutils command line options.) * COMPATIBILITY BREAK: paver.misctasks is no longer imported by default, even when using paver.easy * DEPRECATIONS: paver.runtime and paver.defaults have been deprecated. Watch the warnings for info on how to change to the new paver.easy module. * COMPATIBILITY WARNING: By default, the sh() function will now raise a BuildFailure exception if the return code of the process is non-zero. Passing ignore_error=True will switch back to the previous behavior. Thanks to Marc Sibson. * There is a new call_pavement function (automatically imported with from paver.easy import \*) that can call another pavement file. The new pavement gets its own environment/options but runs in the same process. * You can now specify an alternate file to run rather than "pavement.py" using the -f or --file global option. Thanks to Marc Sibson. * Regardless of logging level, output for a task is captured. If there is a BuildFailure, then that captured output is displayed. * The new paver.tasks module encapsulates everything needed for running tasks in a file. The distutils ties have been reduced. * @needs now accepts a list of requirements in the form @needs('task1', 'task2') (passing in a list still works as well) * Added paver.bzr (support for Bazaar-NG related operations), courtesy of Bryan Forbes. * The error() function is now exported, for logging of errors (thanks to Marc Sibson) * Added handy paver.svn.export function for exporting an svn repository revision (thanks to Marc Sibson) * The "scripts" directory has been renamed "distutils_scripts" to avoid name collision on Windows. 0.8.1 (June 2, 2008) -------------------- * Fix bug in minilib on Windows (error in rmtree). Also simplifies the minilib implementation. Patch from Juergen Hermann. * Fix bug in virtualenv bootstrap generation (patches from Michael Greene and Juergen Hermann. Michael Greene's is the one that was applied.) 0.8 (May 19, 2008) ------------------ * Installation on Windows was broken due to a / at the end of the /paver/tests path in MANIFEST.in * Options can now be set on the command line using the syntax option.name=value. Options are set at the point in which they appear on the command line, so you can set one value before task1 and then another value before task2. * Option ordering can now take an explicit dictionary or Bunch added to the ordering. This allows you to put in new options without changing the global options dictionary and more closely resembles how options would be looked up in a buildout. * call_task now supports an optional "options" argument that allows you to pass in a dictionary or Bunch that is added to the front of the option search ordering. 0.7.3 (May 16, 2008) -------------------- * Added include_markers parameter to the paver.doctools.Includer to display a nice comment with the name of the file and section. This can look more attractive than the raw cog. By default, this is turned off. Set options.cog.include_markers to an empty dictionary, and the default include markers will be used. * Added options.cog.delete_code to remove the generator code when cogging. Default: false * Paver 0.7.2 could not be installed by zc.buildout on the Mac due to a problem with the py2app command under that environment. * cog and tests were missing from shipped distributions (bug 229324, fixed with a patch from Krys Wilken.) * Added svn.checkup function that does a checkout or update. This is like an svn:externals that's a bit more readable and easier to control, in my opinion. 0.7.2 (May 8, 2008) ------------------- * Fixed Python 2.4 compatibility. The paver-minilib.zip file contained 2.5 .pyc files. .pyc files are not compatible between major Python versions. The new version contains .py files. 0.7.1 (May 8, 2008) ------------------- * 0.7 had a broken paver-minilib.zip (missing misctasks.py, which is now part of the standard minilib) 0.7 (May 7, 2008) ---------------------- Breaking changes: * "targets" have become "tasks", because that name is a clearer description. * paver.sphinxdoc has been renamed paver.doctools New features and changes: * runtime.OPTIONS is gone now. The old voodoo surrounding the options() function has been replaced with a distinctly non-magical __call__ = update in the Namespace class. * distutils.core.setup is now the command line driver * distutils/setuptools commands can be seamlessly intermingled with Tasks * tasks can have command line settable options via the cmdopts decorator. Additionally, they can use the consume_args decorator to collect up all command line arguments that come after the task name. * Two new tasks: cog and uncog. These run Ned Batchelder's Cog code generator (included in the Paver package), by default against your Sphinx documentation. The idea is that you can keep your code samples in separate files (with unit tests and all) and incorporate them into your documentation files. Unlike the Sphinx include directives, using Cog lets you work on your documentation with the code samples in place. * paver.doctools.SectionedFile provides a convenient way to mark off sections of a file, usually for documentation purposes, so that those sections can be included in another documentation file. * paver.doctools.Includer knows how to look up SectionedFiles underneath a directory and to cache their sections. * options are now a "Namespace" object that will search the sections for values. By default, the namespace is searched starting with top-level items (preserving current behavior) followed by a section named the same as the task, followed by all of the other sections. The order can be changed by calling options.order. * option values that are callable will be called and that value returned. This is a simple way to provide lazy evaluation of options. * Added minilib task that creates a paver-minilib.zip file that can be used to distribute programs that use Paver for their builds so that setup.py will run even without Paver fully installed. * Added generate_setup task that creates a setup.py file that will actually run Paver. This will detect paver-minilib.zip if it's present. * The "help" task has been greatly improved to provide a clearer picture of the tasks, options and commands available. * Add the ability to create virtualenv bootstrap scripts * The "help" property on tasks has changed to "description" * output is now directed through distutils.log * Ever improving docs, including a new Getting Started guide. * Changes to Paver's bootstrap setup so that Paver no longer uses distutils for its bootstrapping. There were no versions 0.5 and 0.6. 0.4 (April 22, 2008) -------------------- * First public release. * Removes setuptools dependency * More docs * Paver can now be run even without a pavement.py file for commands like help and paverdocs Paver-1.2.1/paver/docs/_sources/foreword.txt0000644000175000017500000001030612152711177021231 0ustar almadalmad00000000000000******************** Foreword: Why Paver? ******************** Paver occupies a sweet spot in the python toolset, the design is sound, it's easier than mud to work with at a basic level, and it has a nice grade of descent into more advanced things. -- David Eyk I didn't want to make a new build tool. Honestly. The main reason that I created Paver is... The Declarative/Imperative Divide --------------------------------- When you solve the same problem repeatedly, patterns emerge and you're able to easily see ways to reduce how much effort is involved in solving that problem. Often times, you'll end up with a `declarative solution`_. Python's standard distutils is a declarative solution. In your call to the ``setup()`` function, you declare some metadata about your project and provide a list of the parts and you end up with a nice command line interface. That command line interface knows how to make redistributable tarballs (and eggs if you have setuptools), install the package, build C extensions and more. zc.buildout does a similar thing for deployments. Declare the parts of your system and specify a recipe for each part (each recipe with its own collection of options) and you can build up a consistent system with one command. These tools sound great, don't they? They are great. As long as you don't need to customize the capabilities they provide. For example, it's not uncommon that you'll need to move some file here, create some directory there, etc. Then what? In an `imperative system`_, you'd just add the few lines of code you need. For distutils and zc.builout and other similar tools, the answer usually involves extra boilerplate surrounding the code in question and then installing that code somewhere. You basically have to create declarative syntax for something that is a one-off rather than a larger, well-understood problem. And, for distutils and zc.buildout, you have to use two entirely different mechanisms. .. _`declarative solution`: http://en.wikipedia.org/wiki/Declarative_programming .. _`imperative system`: http://en.wikipedia.org/wiki/Imperative_programming Consistency for Project Related Tasks ------------------------------------- And that's the next thing that bothered me with the state of Python tools. It would be nice to have a consistent interface in command line and configuration for the tools that I use to work with my projects. Every tool I bring in to the project adds new command line interfaces, more config files (and some of those config files duplicate project metadata!). That's Why Paver Is Here ------------------------ Paver is set up to provide declarative handling of common tasks with as easy an escape hatch to imperative programming as possible (just add a function with a decorator in the same file). Your project-related configuration options are all together and all accessible to different parts of your build and deployment setup. And the language used for everything is Python, so you're not left guessing how to do a ``for`` loop. Of course, rebuilding the great infrastructure provided by tools like distutils makes no sense. So, Paver just uses distutils and other tools directly. Paver also goes beyond just providing an extension mechanism for distutils. It adds a bunch of useful capabilities for things like working with files and directories, elegantly handling sample code for your documentation and building bootstrap scripts to allow your software to easily be installed in an isolated virtualenv. I'm already using Paver for SitePen's Support service user interface project and I use Paver to manage Paver itself! It's been working out great for me, and it's set up in such a way that whatever kind of scripting your project needs it should be pretty simple with Paver. Making the Switch is Easy ------------------------- Finally, I've put some time into making sure that moving a project from distutils to Paver is easy for everyone involved (people making the projects and people using the projects). Check out the :ref:`Getting Started Guide ` to see an example of how a project moves from distutils to Paver (even maintaining the ``python setup.py install`` command that everyone's used to!) Thanks for reading! Kevin Dangoor May 2008 Paver-1.2.1/paver/docs/_sources/pavement.txt0000644000175000017500000002135712152711177021231 0ustar almadalmad00000000000000.. _pavement: pavement.py in depth ==================== Paver is meant to be a hybrid declarative/imperative system for getting stuff done. You declare things via the options in pavement.py. And, in fact, many projects can get away with nothing but options in pavement.py. Consider, for example, an early version of Paver's own pavement file:: from paver.easy import * import paver.doctools options( setup=dict( name='paver', version="0.3", description='Python build tool', author='Kevin Dangoor', author_email='dangoor+paver@gmail.com', #url='', packages=['paver'], package_data=setuputils.find_package_data("paver", package="paver", only_in_packages=False), install_requires=[], test_suite='nose.collector', zip_safe=False, entry_points=""" [console_scripts] paver = paver.command:main """, ), sphinx=Bunch( builddir="build", sourcedir="source" ) ) @task @needs('paver.doctools.html') def html(): """Build Paver's documentation and install it into paver/docs""" builtdocs = path("docs") / options.sphinx.builddir / "html" destdir = path("paver") / "docs" destdir.rmtree() builtdocs.move(destdir) This file has both declarative and imperative aspects. The options define enough information for distutils, setuptools and Sphinx to do their respective jobs. This would function just fine without requiring you to define any tasks. However, for Paver's 'paverdoc' built-in task to work, we need Sphinx's generated HTML to end up inside of Paver's package tree. So, we override the html task to move the generated files. Defining Tasks -------------- Tasks are just simple functions. You designate a function as being a task by using the @task decorator. You can also specify that a task depends on another task running first with the @needs decorator. A given task will only run once as a dependency for other tasks. Manually Calling Tasks ---------------------- Sometimes, you need to do something `before` running another task, so the @needs decorator doesn't quite do the job. Of course, tasks are just Python functions. So, you can just call the other task like a function! How Task Names Work --------------------- Tasks have both a long name and a short name. The short name is just the name of the function. The long name is the fully qualified Python name for the function object. For example, the Sphinx support includes a task function called "html". That task's long name is "paver.doctools.html". If you ```import paver.doctools``` in your pavement.py, you'll be able to use either name to refer to that task. Tasks that you define in your pavement are always available by their short names. Tasks defined elsewhere are available by their short names unless there is a conflict where two tasks are trying to use the same short name. Tasks are always available unambiguously via their long names. Task Parameters --------------- Tasks don't have to take any parameters. However, Paver allows you to work in a fairly clean, globals-free manner(*). Generally speaking, the easiest way to work with paver is to just do ``from paver.easy import *``, but if you don't like having so much in your namespace, you can have any attribute from tasks.environment sent into your function. For example:: @task def my_task(options, info): # this task will get the options and the "info" logging function # sent in pass (*): well, there *is* one global: tasks.environment. Command Line Arguments ---------------------- Tasks can specify that they accept command line arguments, via three other decorators. The ``@consume_args`` decorator tells Paver that *all* command line arguments following this task's name should be passed to the task. If you'd like specifying a number of consumed arguments, let use ``@consume_nargs``. This later is similar by default to the previous, but alos accept as an ``int`` argument the number of command line arguments the decorated task will consume. You can either look up the arguments in ``options.args``, or just specify args as a parameter to your function. For example, Paver's "help" task is declared like this:: @task @consume_args def help(args, help_function): pass @task @consume_nargs(3) def mytask(args): pass The "args" parameter is just an attribute on tasks.environment (as is help_function), so it is passed in using the same rules described in the previous section. .. versionadded:: 1.1.0 ``@consume_nargs`` decorator superseeds ``@consume_args``, and optionally accepts an ``int`` as argument: the number of command line argument the decorated task will consume. More generally, you're not trying to consume all of the remainder of the command line but to just accept certain specific arguments. That's what the cmdopts decorator is for:: @task @cmdopts([ ('username=', 'u', 'Username to use when logging in to the servers') ]) def deploy(options): pass @cmdopts takes a list of tuples, each with long option name, short option name and help text. If there's an "=" after the long option name, that means that the option takes a parameter. Otherwise, the option is assumed to be boolean. The command line options set in this manner are all added to the ``options`` under a namespace matching the name of the task. In the case above, options.deploy.username would be set if the user ran paver deploy -u my-user-name. Note that an equivalent command line would be paver deploy.username=my-user-name deploy For fine-tuning, you may add ``optparse.Option`` instances:: @tasks.task @tasks.cmdopts([ make_option("-f", "--foo", help="foo") ]) def foo_instead_of_spam_and_eggs(options): pass You may share ``@cmdopts`` between tasks. To do that and to avoid confusion, You have to add share_with argument:: @task @cmdopts([ ('username=', 'u', 'Username to use when logging in to the servers') ]) def deploy_to_linux(options): pass @task @needs(['deploy_to_linux']) @cmdopts([ ('username=', 'u', 'Username to use when logging in to the servers') ], share_with=['deploy_to_linux']) def deploy(options): pass For sharing, following must be fullfilled: * Both long and short option names must be same * ``share_with`` argument must be specified on top-level task Otherwise, ``PavementError`` is raised. Hiding tasks --------------- Some tasks may only exist as a shared dependency between other tasks and may not make sense to be called directly. There is no way to provide that, however you can hide them from ``paver help`` to reduce noise. Just decorate function with ``@no_help`` decorator:: @task @no_help def hidden_dependency(): pass Of course, this should not be used usually. If task is not to be called at all, why not just make them a g'old function? More complex dependencies -------------------------- ``@needs`` might not cover all your needs. For example, depending on argument or environment, you might decide to call an appropriate task in the middle of another one. There are two key options for fixing that: #. ``@might_call`` decorator, which indicates that task might invoke ``call_task`` on one or more of the specified tasks. This allows you to provide command line options to task that might be called (it is inserted in dependency chain):: @task @cmdopts([ ('username=', 'u', 'Whom to greet') ], share_with=['deploy_to_linux']) def say_hello(options): if not hasattr(options, "username"): print 'SPAM' else: print 'Hello, my dear user %s' % options.username @task @might_call('say_hello') def greet_user(options): setup_environment() call_task('say_hello') do_cleanup() #. Providing options and arguments to another tasks directly. Options are provided with final assigned value:: @task @cmdopts([ ('long-username=', 'u', 'Whom to greet') ], share_with=['deploy_to_linux']) def say_hello(options): if not hasattr(options, "username"): print 'SPAM' else: print 'Hello, my dear user %s' % options.long_username @task def greet_user(options): call_task('say_hello', options={ 'long_username' : 'Kitty' }) Console arguments (args) should be passed as in console:: @task @consume_args def say_hello(args): print 'Hello to ALL the users: %s' % ', '.join(args) @task def greet_user(options): call_task('say_hello', args = [ 'Arthur Pewtey', 'The Reverend Arthur Belling', ]) Paver-1.2.1/paver/docs/_sources/bzr.txt0000644000175000017500000000017712152711177020204 0ustar almadalmad00000000000000.. _bzr: Using with Bazaar-NG (bzr) (paver.bzr) ====================================== .. automodule:: paver.bzr :members:Paver-1.2.1/paver/docs/_sources/files.txt0000644000175000017500000000020512152711177020501 0ustar almadalmad00000000000000.. _filehandling: File Handling in Paver (paver.path) =================================== .. automodule:: paver.path :members: Paver-1.2.1/paver/docs/_sources/setuptools.txt0000644000175000017500000000055112152711177021624 0ustar almadalmad00000000000000.. _setuptools: distutils and setuptools (paver.setuputils) =========================================== Paver makes it very easy to use and extend Python's standard distribution mechanisms. The :ref:`Getting Started Guide ` has a useful example of moving from distutils and setuptools to Paver. .. automodule:: paver.setuputils :members: Paver-1.2.1/paver/docs/_sources/cmdline.txt0000644000175000017500000000263512152711177021023 0ustar almadalmad00000000000000.. _cmdline: Paver Command Line ================== Paver does sophisticated command line parsing globally and for each task:: paver [-q] [-n] [-v] [-f pavement] [-h] [option.name=key] [taskname] [taskoptions] [taskname...] The command line options are: -q quiet... don't display much info (info and debug messages are not shown) -n dry run... don't actually run destructive commands -v verbose... display debug level output -h display the command line options and list of available tasks. Note that -h can be provided for any task to display the command line options and detailed help for that task. -f use a different file than "pavement.py" If you run paver without a task, it will only run the "auto" task, if there is one. Otherwise, Paver will do nothing. ``paver help`` is the equivalent of ``paver -h``, and ``paver help taskname`` is the equivalent of ``paver taskname -h``. You can set build options via the command line by providing optionname=value. The option names can be in dotted notation, so ``foo.bar.baz=something`` will set options['foo']['bar']['baz'] = 'something' in the options. If you need to enter a value with multiple words, put quotes around the part with the space. `Important and useful`: Options are set at the point in which they appear in the command line. That means that you can set an option before one task and then set it to another value for the next task. Paver-1.2.1/paver/docs/_sources/credits.txt0000644000175000017500000000217312152711177021042 0ustar almadalmad00000000000000.. _credits: Credits ======= * Kevin Dangoor is the original author, designer and coder. * The Paver project has gotten patches from Juergen Hermann, Marc Sibson, Greg Thornton, Michael Greene, Krys Wilken, Bryan Forbes and Ryan Wilcox. * Ned Batchelder's "cog" package is included for handling inclusion of files into the docs. * Ian Bicking provided a lot of great input prior to Paver's initial release pointers to code that he's been using both at Open Planning and prior to working there. * Ian is also the original author of the paver.setuputils.find_package_data function. * Jason Orendorff wrote the original path.py module that paver.path is based upon. * Michael Foord's Mock module is included to assist in testing. * Ian Bicking, Jim Fulton, Philip Eby and Georg Brandl lead the various projects that the Paver Standard Library takes advantage of. Without those projects, Paver users would have to do a lot more work. * Though it seems almost too obvious for a Python project, Guido van Rossum deserves credit for making and steering a language that is so flexible and clean for such a wide variety of tasks. Paver-1.2.1/paver/docs/_sources/doctools.txt0000644000175000017500000000020612152711177021226 0ustar almadalmad00000000000000.. _doctools: Documentation Tools (paver.doctools) ==================================== .. automodule:: paver.doctools :members: Paver-1.2.1/paver/docs/_sources/index.txt0000644000175000017500000001277212152711177020522 0ustar almadalmad00000000000000=========================================== Paver: Easy Scripting for Software Projects =========================================== .. image:: _static/paver_banner.jpg :height: 126 :width: 240 `Japanese translation available `_ thanks to Tetsuya Morimoto. Latest stable documentation is `on PyPI `_, latest development docs are `on github pages `_ Paver is a Python-based software project scripting tool along the lines of Make or Rake. It is not designed to handle the dependency tracking requirements of, for example, a C program. It *is* designed to help out with all of your other repetitive tasks (run documentation generators, moving files around, downloading things), all with the convenience of Python's syntax and massive library of code. If you're developing applications in Python, you get even more... Most public Python projects use distutils or setuptools to create source tarballs for distribution. (Private projects can take advantage of this, too!) Have you ever wanted to generate the docs before building the source distribution? With Paver, you can, trivially. Here's a complete pavement.py:: from paver.easy import * from paver.setuputils import setup setup( name="MyCoolProject", packages=['mycool'], version="1.0", url="http://www.blueskyonmars.com/", author="Kevin Dangoor", author_email="dangoor@gmail.com" ) @task @needs(['html', "distutils.command.sdist"]) def sdist(): """Generate docs and source distribution.""" pass With that pavement file, you can just run ``paver sdist``, and your docs will be rebuilt automatically before creating the source distribution. It's also easy to move the generated docs into some other directory (and, of course, you can tell Paver where your docs are stored, if they're not in the default location.) Features -------- * Build files are :ref:`just Python ` * :ref:`One file with one syntax `, pavement.py, knows how to manage your project * :ref:`File operations ` are unbelievably easy, thanks to the built-in version of Jason Orendorff's path.py. * Need to do something that takes 5 lines of code? :ref:`It'll only take 5 lines of code. `. * Completely encompasses :ref:`distutils and setuptools ` so that you can customize behavior as you need to. * Wraps :ref:`Sphinx ` for generating documentation, and adds utilities that make it easier to incorporate fully tested sample code. * Wraps :ref:`Subversion ` for working with code that is checked out. * Wraps :ref:`virtualenv ` to allow you to trivially create a bootstrap script that gets a virtual environment up and running. This is a great way to install packages into a contained environment. * Can use all of these other libraries, but :ref:`requires none of them ` * Easily transition from setup.py without making your users learn about or even install Paver! (See the :ref:`Getting Started Guide ` for an example). See how it works! Check out the :ref:`Getting Started Guide `. Paver was created by `Kevin Dangoor `_ of `SitePen `_. Status ------ Paver has been in use in production settings since mid-2008, and significant attention is paid to backwards compatibility since the release of 1.0. See the :ref:`changelog ` for more information about recent improvements. Installation ------------ The easiest way to get Paver is if you have pip_ or distutils_ installed. ``pip install Paver`` or ``easy_install Paver`` Without setuptools, it's still pretty easy. Download the Paver .tgz file from `Paver's Cheeseshop page`_, untar it and run: ``python setup.py install`` .. _Paver's Cheeseshop page: http://pypi.python.org/pypi/Paver/ .. _pip: http://www.pip-installer.org .. _distribute: https://pypi.python.org/pypi/distribute Help and Development -------------------- You can get help from the `mailing list`_. If you'd like to help out with Paver, you can check the code out from github: ``git clone https://github.com/paver/paver.git`` Ideally, create a fork, fix an issue from `Paver's list of issues`_ (or create an issue Yourself) and send a pull request. Your help is appreciated! Running test suite =================== Paver contains both unit and integration test suite. Unittests are run by either ``paver test`` or ``paver unit``. Integration tests can be run by ``paver integrate``. Using older, system-wide installed paver to run tests on development version can lead to bad interactions (see `issue 33`_). Please, run paver test suite using development version itself, by: * Creating virtual environment with --no-site-packages and * Installing development version with python setup.py develop or * Using embedded minilib, thus invoking commands with setup.py instead of paver .. _mailing list: http://groups.google.com/group/paver .. _Paver's list of issues: https://github.com/paver/paver/issues .. _issue 33: https://github.com/paver/paver/issues/33 License ------- Paver is licensed under a BSD license. See the LICENSE.txt file in the distribution. Contents -------- .. toctree:: :maxdepth: 2 foreword features getting_started pavement paverstdlib cmdline tips articles changelog credits Indices and tables ------------------ * :ref:`genindex` * :ref:`modindex` * :ref:`search` Paver-1.2.1/paver/docs/_sources/misctasks.txt0000644000175000017500000000031312152711177021400 0ustar almadalmad00000000000000Miscellaneous Tasks (paver.misctasks) ===================================== These are some other tasks that are located in the paver.misctasks module. .. automodule:: paver.misctasks :members: Paver-1.2.1/paver/docs/_sources/articles.txt0000644000175000017500000000213112152711177021205 0ustar almadalmad00000000000000.. _articles: Articles about Paver ==================== * `Converting from Make to Paver`_ - Doug Hellman's look at how he moved from Make to Paver for Python Module of the Week. * `Writing Technical Documentation with Sphinx, Paver and Cog`_ - Doug Hellman's in-depth article about how he produces the Python Module of the Week series. * `Initial announcement`_ and background about the project * `Release 0.7 announcement`_ * `Paver 1.0a1 announcement`_ (the ill-fated release that was recalled) .. _Converting from Make to Paver: http://blog.doughellmann.com/2009/01/converting-from-make-to-paver.html .. _Writing Technical Documentation with Sphinx, Paver and Cog: http://blog.doughellmann.com/2009/02/writing-technical-documentation-with.html .. _Initial announcement: http://www.blueskyonmars.com/2008/04/22/paver-and-the-building-distribution-deployment-etc-of-python-projects/ .. _Release 0.7 announcement: http://www.blueskyonmars.com/2008/05/07/paver-07-better-than-distutils-better-docs-and-much-more/ .. _Paver 1.0a1 announcement: http://www.blueskyonmars.com/2009/01/28/paver-10a1-is-out/ Paver-1.2.1/paver/docs/_sources/paverstdlib.txt0000644000175000017500000000042512152711177021722 0ustar almadalmad00000000000000.. _stdlib: The Paver Standard Library ========================== Paver includes several modules that will help you get your project scripting done more quickly. .. toctree:: tasks setuptools files doctools misctasks virtualenv svn bzr ssh Paver-1.2.1/paver/docs/_sources/ssh.txt0000644000175000017500000000020112152711177020170 0ustar almadalmad00000000000000.. _ssh: SSH Remote Access Support (paver.ssh) ===================================== .. automodule:: paver.ssh :members: Paver-1.2.1/paver/docs/_sources/virtualenv.txt0000644000175000017500000000135112152711177021601 0ustar almadalmad00000000000000.. _virtualenv: Virtualenv Support (paver.virtual) ================================== Paver makes it easy to set up virtualenv environments for development and deployment. Virtualenv gives you a place to install Python packages and keep them separate from your main system's Python installation. Using virtualenv with tasks ============================ You may specify which virtual environment should particular task use. Do this with ``@virtualenv`` decorator:: from paver.easy import task from paver.virtual import virtualenv @task @virtualenv(dir="virtualenv") def t1(): import some_module_existing_only_in_virtualenv paver.virtual Tasks =================== .. automodule:: paver.virtual :members: Paver-1.2.1/paver/docs/_sources/getting_started.txt0000644000175000017500000005742012152711212022567 0ustar almadalmad00000000000000.. _gettingstarted: ========================== Getting Started with Paver ========================== Often, the easiest way to get going with a new tool is to see an example in action, so that's how we'll get started with Paver. In the Paver distribution, there are samples under docs/samples. The Getting Started samples are in the "started" directory under there. The Old Way =========== Our first sample is called "The Old Way" (and it's in the docs/samples/started/oldway directory). It's a fairly typical project with one Python package and some docs, and we want to be able to distribute it. Python's distutils_ makes it easy indeed to create a distributable package. We create a setup.py file that looks like this:: #<== include('started/oldway/setup.py')==> from distutils.core import setup setup( name="TheOldWay", packages=['oldway'], version="1.0", url="http://www.blueskyonmars.com/", author="Kevin Dangoor", author_email="dangoor@gmail.com" ) #<==end==> With that simple setup script, you can run:: python setup.py sdist to build a source distribution:: # <== # sh('cd docs/samples/started/oldway; python setup.py sdist', # insert_output=False) # sh('ls -l docs/samples/started/oldway/dist') # ==> celkem 4 -rw-r--r-- 1 almad almad 637 2.en 20.44 TheOldWay-1.0.tar.gz # <==end==> Then your users can run the familiar:: python setup.py install to install the package, or use setuptools' even easier:: easy_install "TheOldWay" for packages that are up on the Python Package Index. .. _distutils: http://docs.python.org/dist/dist.html The Old Way's Docs ------------------ The Old Way project is at least a bit modern in that it uses Sphinx_ for documentation. When you use sphinx-quickstart to get going with your docs, Sphinx will give you a Makefile that you can run to generate your HTML docs. So, generating the HTML docs is easy:: make html Except, in this project (as in Paver itself), we want to include the HTML files in a docs directory in the package for presenting help to the users. We end up creating a shell script to do this:: # <== include("started/oldway/builddocs.sh")==> cd docs make html cd .. rm -rf oldway/docs mv docs/_build/html oldway/docs # <==end==> Of course, creating a script like this means that we have to actually remember to run it. We could change this script to "buildsdist.sh" and add a ``python setup.py sdist`` to the end of the file. But, wouldn't it be nicer if we could just use ``python setup.py sdist`` directly? You can `create new distutils commands`_, but do you really want to drop stuff like that in the distutils/command package in your Python library directory? And how would you call the sdist command anyway? setuptools_ helps, but it still requires setting up a module and entry point for this collection of commands. .. _create new distutils commands: http://docs.python.org/dist/node84.html .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools .. _Sphinx: http://sphinx.pocoo.org Work with me here ----------------- I just `know` there are some people reading this and thinking "man, what a contrived example!". Building, packaging, distributing and deploying of projects is quite custom for every project. Part of the point of Paver is to make it easy to handle whatever weird requirements arise in your project. This example may seem contrived, but it should give you an idea of how easy Paver makes it to get your tasks done. The New Way =========== Let's bring in Paver now to clean up our scripting a bit. Converting a project to use Paver is really, really simple. Recall the setup function from our Old Way setup.py:: # <== include("started/oldway/setup.py", "setup")==> setup( name="TheOldWay", packages=['oldway'], version="1.0", url="http://www.blueskyonmars.com/", author="Kevin Dangoor", author_email="dangoor@gmail.com" ) # <==end==> Getting Started with Paver -------------------------- setup.py is a standard Python script. It's just called setup.py as a convention. Paver works a bit more like Make or Rake. To use Paver, you run ``paver `` and the paver command will look for a pavement.py file in the current directory. pavement.py is a standard Python module. A typical pavement will import from paver.easy to get a bunch of convenience functions and objects and then import other modules that include useful tasks:: # <== include('started/newway/pavement.py', 'imports')==> from paver.easy import * import paver.doctools from paver.setuputils import setup # <==end==> Converting from setup.py to pavement.py is easy. Paver provides a special ``options`` object that holds all of your build options. ``options`` is just a dictionary that allows attribute-style access and has some special searching abilities. The options for distutils operations are stored in a ``setup`` section of the options. And, as a convenience, Paver provides a setup function that sets the values in that options section (and goes a step further, by making all of the distutils/setuptools commands available as Paver tasks). Here's what the conversion looks like:: # <== include('started/newway/pavement.py', 'setup')==> setup( name="TheNewWay", packages=['newway'], version="1.0", url="http://www.blueskyonmars.com/", author="Kevin Dangoor", author_email="dangoor@gmail.com" ) # <==end==> Paver is compatible with distutils ---------------------------------- Choosing to use Paver does not mean giving up on distutils or setuptools. Paver lets you continue to use distutils and setuptools commands. When you import a module that has Paver tasks in it, those tasks automatically become available for running. If you want access to distutils and setuptools commands as well, you can either use the ``paver.setuputils.setup`` function as described above, or call ``paver.setuputils.install_distutils_tasks()``. We can see this in action by looking at ``paver help``:: # <== sh('cd docs/samples/started/newway; paver help')==> ---> paver.tasks.help Usage: paver [global options] taskname [task options] [taskname [taskoptions]] Options: --version show program's version number and exit -n, --dry-run don't actually do anything -v, --verbose display all logging output -q, --quiet display only errors -i, --interactive enable prompting -f FILE, --file=FILE read tasks from FILE [pavement.py] -h, --help display this help information --propagate-traceback propagate traceback, do not hide it under BuildFailure(for debugging) Tasks from paver.doctools: doc_clean - Clean (delete) the built docs Tasks from setuptools.command: build_py - "build" pure Python modules (copy to build directory) Tasks from paver.misctasks: paverdocs - Open your web browser and display Paver's documentation. Tasks from setuptools.command: test - run unit tests after in-place build Tasks from paver.doctools: cog - Runs the cog code generator against the files matching your specification Tasks from setuptools.command: bdist_rpm - create an RPM distribution Tasks from paver.doctools: uncog - Remove the Cog generated code from files Tasks from setuptools.command: install_egg_info - Install an .egg-info directory for the package Tasks from distutils.command: build_clib - build C/C++ libraries used by Python extensions Tasks from setuptools.command: saveopts - save supplied options to setup.cfg or other config file Tasks from distutils.command: build_scripts - "build" scripts (copy and fixup #! line) Tasks from paver.misctasks: minilib - Create a Paver mini library that contains enough for a simple pavement.py to be installed using a generated setup.py Tasks from distutils.command: bdist_dumb - create a "dumb" built distribution Tasks from paver.misctasks: generate_setup - Generates a setup.py file that uses paver behind the scenes Tasks from setuptools.command: egg_info - create a distribution's .egg-info directory Tasks from sphinx_pypi_upload: upload_sphinx - Upload Sphinx documentation to PyPI Tasks from setuptools.command: bdist_egg - create an "egg" distribution Tasks from nose.commands: nosetests - Run unit tests using nosetests Tasks from distutils.command: check - perform some checks on the package Tasks from setuptools.command: register - register the distribution with the Python package index Tasks from paver.tasks: help - This help display. Tasks from setuptools.command: alias - define a shortcut to invoke one or more commands rotate - delete older distributions, keeping N newest files Tasks from paver.doctools: html - Build HTML documentation using Sphinx Tasks from setuptools.command: easy_install - Find/get/install Python packages Tasks from distutils.command: install_headers - install C/C++ header files install_data - install data files Tasks from setuptools.command: build_ext - build C/C++ extensions (compile/link to build directory) develop - install package in 'development mode' Tasks from distutils.command: build - build everything needed to install Tasks from sphinx.setup_command: build_sphinx - Build Sphinx documentation Tasks from setuptools.command: install_lib - install all Python modules (extensions and pure Python) bdist_wininst - create an executable installer for MS Windows install_scripts - install scripts (Python or otherwise) setopt - set an option in setup.cfg or another config file Tasks from distutils.command: upload - upload binary package to PyPI clean - clean up temporary files from 'build' command Tasks from setuptools.command: sdist - create a source distribution (tarball, zip file, etc.) Tasks from distutils.command: bdist - create a built (binary) distribution Tasks from setuptools.command: install - install everything from build directory Tasks from pavement: sdist - Overrides sdist to make sure that our setup.py is generated. html - Build the docs and put them into our package. deploy - Deploy the HTML to the server. # <==end==> That command is listing all of the available tasks, and you can see near the top there are tasks from distutils.command. All of the standard distutils commands are available. There's one more thing we need to do before our Python package is properly redistributable: tell distutils about our special files. We can do that with a simple MANIFEST.in:: # <== include('started/newway/MANIFEST.in')==> include setup.py include pavement.py include paver-minilib.zip # <==end==> With that, we can run ``paver sdist`` and end up with the equivalent output file:: # <== # sh('cd docs/samples/started/newway; paver sdist', # insert_output=False) # sh('ls -l docs/samples/started/newway/dist') # ==> celkem 48 -rw-r--r-- 1 almad almad 45726 2.en 20.44 TheNewWay-1.0.tar.gz # <==end==> It also means that users of The New Way can also run ``paver install`` to install the package on their system. Neat. But people are used to setup.py! -------------------------------- ``python setup.py install`` has been around a long time. And while you could certainly put a README file in your package telling people to run ``paver install``, we all know that no one actually reads docs. (Hey, thanks for taking the time to read this!) No worries, though. You can run ``paver generate_setup`` to get a setup.py file that you can ship in your tarball. Then your users can run ``python setup.py install`` just like they're used to, and Paver will take over. But people don't have Paver yet! -------------------------------- There are millions of Python installations that don't have Paver yet, but have Python and distutils. How can they run a Paver-based install? Easy, you just run ``paver minilib`` and you will get a file called paver-minilib.zip. That file has enough of Paver to allow someone to install most projects. The Paver-generated setup.py knows to look for that file and use it if it sees it. Worried about bloating your package? The paver-minilib is not large:: # <== # sh('cd docs/samples/started/newway ; paver minilib', # insert_output=False) # sh('ls -l docs/samples/started/newway/paver-minilib.zip') # ==> -rw-r--r-- 1 almad almad 44375 2.en 20.44 docs/samples/started/newway/paver-minilib.zip # <==end==> Paver itself is bootstrapped with a generated setup file and a paver-minilib. Hey! Didn't you just create more work for me? --------------------------------------------- You might have noticed that we now have three commands to run in order to get a proper distribution for The New Way. Well, you can actually run them all at once: ``paver generate_setup minilib sdist``. That's not terrible, but it's also not great. You don't want to end up with a broken distribution just because you forgot one of the tasks. By design, one of the easiest things to do in Paver is to extend the behavior of an existing "task", and that includes distutils commands. All we need to do is create a new sdist task in our pavement.py:: # <== include('started/newway/pavement.py', 'sdist')==> @task @needs('generate_setup', 'minilib', 'setuptools.command.sdist') def sdist(): """Overrides sdist to make sure that our setup.py is generated.""" pass # <==end==> The @task decorator just tells Paver that this is a task and not just a function. The @needs decorator specifies other tasks that should run before this one. You can also use the `call_task(taskname)` function within your task if you wish. The function name determines the name of the task. The docstring is what shows up in Paver's help output. With that task in our pavement.py, ``paver sdist`` is all it takes to build a source distribution after generating a setup file and minilib. .. note:: If you are depending on distutils task (via @needs), you have to call ``setup()`` before task is defined. Under the hood, ``setup`` call installs distutils/setupsools task and make them available, so do not make it conditional. Tackling the Docs ----------------- Until the tools themselves provide tasks and functions that make creating pavements easier, Paver's Standard Library will include a collection of modules that help out for commonly used tools. Sphinx is one package for which Paver has built-in support. To use Paver's Sphinx support, you need to have Sphinx installed and, in your pavement.py, ``import paver.doctools``. Just performing the import will make the doctools-related tasks available. ``paver help html`` will tell us how to use the html command:: # <== sh('paver help paver.doctools.html')==> ---> paver.tasks.help paver.doctools.html ------------------- Usage: paver paver.doctools.html [options] Options: -h, --help display this help information Build HTML documentation using Sphinx. This uses the following options in a "sphinx" section of the options. docroot the root under which Sphinx will be working. Default: docs builddir directory under the docroot where the resulting files are put. default: build sourcedir directory under the docroot for the source files default: (empty string) # <==end==> According to that, we'll need to set the builddir setting, since we're using a builddir called "_build". Let's add this to our pavement.py:: # <== include('started/newway/pavement.py', 'sphinx')==> options( sphinx=Bunch( builddir="_build" ) ) # <==end==> And with that, ``paver html`` is now equivalent to ``make html`` using the Makefile that Sphinx gave us. Getting rid of our docs shell script ------------------------------------ You may remember that shell script we had for moving our generated docs to the right place:: # <== include('started/oldway/builddocs.sh')==> cd docs make html cd .. rm -rf oldway/docs mv docs/_build/html oldway/docs # <==end==> Ideally, we'd want this to happen whenever we generate the docs. We've already seen how to override tasks, so let's try that out here:: # <== include('started/newway/pavement.py', 'html')==> @task @needs('paver.doctools.html') def html(options): """Build the docs and put them into our package.""" destdir = path('newway/docs') destdir.rmtree() builtdocs = path("docs") / options.builddir / "html" builtdocs.move(destdir) # <==end==> There are a handful of interesting things in here. The equivalent of 'make html' is the @needs('paver.doctools.html'), since that's the task we're overriding. Inside our task, we're using "path". This is a customized version of Jason Orendorff's path module. All kinds of file and directory operations become super-simple using this module. We start by deleting our destination directory, since we'll be copying new generated files into that spot. Next, we look at the built docs directory that we'll be moving:: # <== include('started/newway/pavement.py', 'html.builtdocs')==> builtdocs = path("docs") / options.builddir / "html" # <==end==> One cool thing about path objects is that you can use the natural and comfortable '/' operator to build up your paths. The next thing we see here is the accessing of options. The options object is available to your tasks. It's basically a dictionary that offers attribute-style access and can search for variables (which is why you can type options.builddir instead of the longer options.sphinx.builddir). That property of options is also convenient for being able to share properties between sections. And with that, we eliminate the shell script as a separate file. Fixing another wart in The Old Way ---------------------------------- In the documentation for The Old Way, we actually included the function body directly in the docs. But, we had to cut and paste it there. Sphinx does offer a way to include an external file in your documentation. Paver includes a better way. There are a couple of parts to the documentation problem: 1. It's good to have your code in separate files from your docs so that the code can be complete, runnable and, above all, testable programs so that you can be sure that everything works. 2. You want your writing and the samples included with your writing to stand up as reasonable, coherent documents. Python's doctest style does not always lend itself to coherent documents. 3. It's nice to have the code sample that you're writing about included inline with the documents as you're writing them. It's easier to write when you can easily see what you're writing about. #1 and #3 sound mutually exclusive, but they're not. Paver has a two part strategy to solve this problem. Let's look at part of the index.rst document file to see the first part:: # <== include("started/newway/docs/index.rst", "mainpart")==> Welcome to The New Way's documentation! ======================================= This is the Paver way of doing things. The key functionality here is in this powerful piece of code, which I will `include` here in its entirety so that you can bask in its power:: # [[[cog include("newway/thecode.py", "code")]]] # [[[end]]] # <==end==> In The New Way's index.rst, you can see the same mechanism being used that is used in this Getting Started guide. Paver includes Ned Batchelder's Cog_ package. Cog lets you drop snippets of Python into a file and have those snippets generate stuff that goes into the file. Unlike a template language, Cog is designed so that you can leave the markers in and regenerate as often as you need to. With a template language, you have the template and the finalized output, but not a file that has both. So, as I'm writing this Getting Started document, I can glance up and see the index.rst contents right inline. You'll notice The #[[[cog part in there is calling an include() function. This is the second part offered by Paver. Paver lets you specify an "includedir" for use with Cog. This lets you include files relative to that directory. And, critically, it also lets you mark off sections of those files so that you can easily include just the part you want. In the example above, we're picking up the 'code' section of the newway/thecode.py file. Let's take a look at that file:: # <== sh("cat docs/samples/started/newway/newway/thecode.py") ==> """This is our powerful, code-filled, new-fangled module.""" # [[[section code]]] def powerful_function_and_new_too(): """This is powerful stuff, and it's new.""" return 2*1 # [[[endsection]]] # <==end==> Paver has a Cog-like syntax for defining named sections. So, you just use the ``include`` function with the relative filename and the section you want, and it will be included. Sections can even be nested (and you refer to nested sections using familiar dotted notation). .. _Cog: http://nedbatchelder.com/code/cog/ Bonus Deployment Example ------------------------ pavements are just standard Python. The syntax for looping and things like that are just what you're used to. The options are standard Python so they can contain lists and other objects. Need to deploy to multiple hosts? Just put the hosts in the options and loop over them. Let's say we want to deploy The New Way project's HTML files to a couple of servers. This is similar to what I do for Paver itself, though I only have one server. First, we'll set up some variables to use for our deploy task:: # <== include('started/newway/pavement.py', 'deployoptions')==> options( deploy = Bunch( htmldir = path('newway/docs'), hosts = ['host1.hostymost.com', 'host2.hostymost.com'], hostpath = 'sites/newway' ) ) # <==end==> As you can see, we can put whatever kinds of objects we wish into the options. Now for the deploy task itself:: # <== include("started/newway/pavement.py", "deploy")==> @task @cmdopts([ ('username=', 'u', 'Username to use when logging in to the servers') ]) def deploy(options): """Deploy the HTML to the server.""" for host in options.hosts: sh("rsync -avz -e ssh %s/ %s@%s:%s/" % (options.htmldir, options.username, host, options.hostpath)) # <==end==> You'll notice the new "cmdopts" decorator. Let's say that you have sensitive information like a password that you don't want to include in your pavement. You can easily make it a command line option for that task using cmdopts. options.deploy.username will be set to whatever the user enters on the command line. It's also worth noting that when looking up options, Paver gives priority to options in a section with the same name as the task. So, options.username will prefer options.deploy.username even if there is a username in another section. Our deploy task uses a simple for loop to run an rsync command for each host. Let's do a dry run providing a username to see what the commands will be:: # <== sh("cd docs/samples/started/newway; paver -n deploy -u kevin")==> ---> pavement.deploy rsync -avz -e ssh newway/docs/ kevin@host1.hostymost.com:sites/newway/ rsync -avz -e ssh newway/docs/ kevin@host2.hostymost.com:sites/newway/ # <==end==> Where to go from here --------------------- The first thing to do is to just get started using Paver. As you've seen above, it's easy to get Paver into your workflow, even with existing projects. Use the ``paver help`` command. If you really want more detail now, you'll want to read more about :ref:`pavement files ` and the :ref:`Paver Standard Library `. Paver-1.2.1/paver/docs/_sources/tips.txt0000644000175000017500000000122112152711177020355 0ustar almadalmad00000000000000*************** Tips and Tricks *************** Using a Config File For Settings -------------------------------- Many people like to have their configuration metadata available in a *data file*, rather than a Python program. This is easy to do with Paver:: from paver.easy import * @task def auto(): config_data = (read config data using config parser of choice) # assuming config_data is a dictionary options.update(config_data) The auto task is automatically run when the pavement is launched. You can use Python's standard ConfigParser module, if you'd like to store the information in an .ini file.Paver-1.2.1/paver/docs/articles.html0000644000175000017500000001235712152711213017512 0ustar almadalmad00000000000000 Articles about Paver — Paver 1.2.1 documentation

Articles about Paver

Previous topic

Tips and Tricks

Next topic

Paver Changelog

This Page

Paver-1.2.1/paver/docs/features.html0000644000175000017500000002324312152711213017516 0ustar almadalmad00000000000000 Paver’s Features — Paver 1.2.1 documentation

Paver’s Features

Files Are Just Python

Python has a very concise, readable syntax. There’s no need to create some mini-language for describing your builds. Quite often it seems like these mini-languages are missing features that you need. By using Python as its syntax, you can always be sure that you can express whatever it is you need to do easily. A for loop is just a for loop:

for fn in ["f1.txt", "f2.txt", "f3.txt"]:
    p = path(fn)
    p.remove()

One File with One Syntax

When putting together a Python project today, you get into a collection of tools to get the job done. distutils and setuptools are the standards for getting packages put together. zc.buildout and virtualenv are used for installation into isolated deployment environments. Sphinx provides a great way to document Python projects.

To put together a total system, you need each of these parts. But they each have their own way of working. The goal with the Paver Standard Library is to make the common tools have a more integrated feel, so you don’t have to guess as much about how to get something done.

As of today, Paver is tightly integrated with distutils and setuptools, and can easily work as a drop-in, more easily scriptable replacement for setup.py.

Easy file operations

Paver includes a customized version of Jason Orendorff’s awesome path.py module. Operations on files and directories could hardly be easier, and the methods have been modified to support “dry run” behavior.

Small bits of behavior take small amounts of work

Imagine you need to do something that will take you 5 lines of Python code. With some of the tools that Paver augments, it’ll take you a lot more effort than those 5 lines of code. You have to read about the API for making new commands or recipes or otherwise extending the package. The goal when using Paver is to have a five line change take about five lines to make.

For example, let’s say you need to perform some extra work when and ‘sdist’ is run. Good luck figuring out the best way to do that with distutils. With Paver, it’s just:

@task
def sdist():
    # perform fancy file manipulations
    blah.blah.blah()

    # *now* run the sdist
    call_task("setuptools.command.sdist")

Can Take Advantage of Libraries But Doesn’t Require Them

The Paver Standard Library includes support for a lot of the common tools, but you don’t necessarily need all of those tools, and certainly not on every project. Paver is designed to have no other requirements but to automatically take advantage of other tools when they’re available.

Paver-1.2.1/paver/docs/doctools.html0000644000175000017500000003216212152711213017526 0ustar almadalmad00000000000000 Documentation Tools (paver.doctools) — Paver 1.2.1 documentation

Documentation Tools (paver.doctools)

Tasks and utility functions and classes for working with project documentation.

class paver.doctools.Includer(basedir, cog=None, include_markers=None)

Looks up SectionedFiles relative to the basedir.

When called with a filename and an optional section, the Includer will:

  1. look up that file relative to the basedir in a cache
  2. load it as a SectionedFile if it’s not in the cache
  3. return the whole file if section is None
  4. return just the section desired if a section is requested

If a cog object is provided at initialization, the text will be output (via cog’s out) rather than returned as a string.

You can pass in include_markers which is a dictionary that maps file extensions to the single line comment character for that file type. If there is an include marker available, then output like:

# section ‘sectionname’ from ‘file.py’

There are some default include markers. If you don’t pass in anything, no include markers will be displayed. If you pass in an empty dictionary, the default ones will be displayed.

class paver.doctools.SectionedFile(filename=None, from_string=None)

Loads a file into memory and keeps track of all of the sections found in the file. Sections are started with a line that looks like this:

[[[section SECTIONNAME]]]

Anything else can appear on the line outside of the brackets (so if you’re in a source code file, you can put the section marker in a comment). The entire lines containing the section markers are not included when you request the text from the file.

An end of section marker looks like this:

[[[endsection]]]

Sections can be nested. If you do nest sections, you will use dotted notation to refer to the inner sections. For example, a “dessert” section within an “order” section would be referred to as “order.dessert”.

The SectionedFile provides dictionary-style access to the sections. If you have a SectionedFile named ‘sf’, sf[sectionname] will give you back a string of that section of the file, including any inner sections. There won’t be any section markers in that string.

You can get the text of the whole file via the all property (for example, sf.all).

Section names must be unique across the file, but inner section names are kept track of by the full dotted name. So you can have a “dessert” section that is contained within two different outer sections.

Ending a section without starting one or ending the file without ending a section will yield BuildFailures.

all

Property to get access to the whole file.

paver.doctools.cog(options)

Runs the cog code generator against the files matching your specification. By default, cog will run against any .rst files in your Sphinx document root. Full documentation for Cog is here:

http://nedbatchelder.com/code/cog/

In a nutshell, you put blocks in your file that look like this:

[[[cog cog.outl(“Hi there!”) ]]] [[[end]]]

Cog will replace the space between ]]] and [[[end]]] with the generated output. In this case, Hi there!

Here are the options available for the cog task. These are looked up in the ‘cog’ options section by default. The ‘sphinx’ option set is also searched.

basedir
directory to look in for files to cog. If not set, ‘docroot’ is looked up.
pattern
file glob to look for under basedir. By default, *.rst
includedir

If you have external files to include in your documentation, setting includedir to the root of those files will put a paver.doctools.Includer in your Cog namespace as ‘include’. This lets you easily include files and sections of files. Here’s an example usage:

[[[cog include('filename_under_includedir.py', 'mysection')]]]
[[[end]]]
defines
Dictionary of objects added to your Cog namespace. (can supersede ‘include’ and ‘sh’ defined by includedir.)
beginspec
String used at the beginning of the code generation block. Default: [[[cog
endspec
String used at the end of the code generation block. Default; ]]]
endoutput
String used at the end of the generated output Default: [[[end]]]
delete_code
Remove the generator code. Note that this will mean that the files that get changed cannot be changed again since the code will be gone. Default: False
include_markers

Dictionary mapping file extensions to the single line comment marker for that file. There are some defaults. For example, ‘py’ maps to ‘# ‘. If there is a known include marker for a given file, then a comment will be displayed along the lines of:

# section ‘SECTIONNAME’ in file ‘foo.py’

If this option is not set, these lines will not be displayed at all. If this option is set to an empty dictionary, the default include markers will be displayed. You can also pass in your own extension -> include marker settings.

paver.doctools.doc_clean()

Clean (delete) the built docs. Specifically, this deletes the build directory under the docroot. See the html task for the options list.

paver.doctools.html()

Build HTML documentation using Sphinx. This uses the following options in a “sphinx” section of the options.

docroot
the root under which Sphinx will be working. Default: docs
builddir
directory under the docroot where the resulting files are put. default: build
sourcedir
directory under the docroot for the source files default: (empty string)
paver.doctools.uncog(options)

Remove the Cog generated code from files. Often, you will want to do this before committing code under source control, because you don’t generally want generated code in your version control system.

This takes the same options as the cog task. Look there for more information.

Previous topic

File Handling in Paver (paver.path)

Next topic

Miscellaneous Tasks (paver.misctasks)

This Page

Paver-1.2.1/paver/docs/svn.html0000644000175000017500000001546312152711213016513 0ustar almadalmad00000000000000 Using with Subversion (paver.svn) — Paver 1.2.1 documentation

Using with Subversion (paver.svn)

Convenience functions for working with svn.

This module does not include any tasks, only functions.

At this point, these functions do not use any kind of library. They require the svn binary on the path.

paver.svn.checkout(url, dest, revision='')

Checks out the specified URL to the given destination.

paver.svn.checkup(url, dest, revision='')

Does a checkout or update, depending on whether the destination exists and is up to date (if a revision is passed in). Returns true if a checkout or update was performed. False otherwise.

paver.svn.export(url, dest, revision='')

Exports the specified URL to the given destination.

paver.svn.info(path='')

Retrieves the svn info for the path and returns a dictionary of the values. Names are normalized to lower case with spaces converted to underscores.

paver.svn.update(path='', revision='')

Run an svn update on the given path.

Previous topic

Virtualenv Support (paver.virtual)

Next topic

Using with Bazaar-NG (bzr) (paver.bzr)

This Page

Paver-1.2.1/paver/docs/setuptools.html0000644000175000017500000002042412152711213020117 0ustar almadalmad00000000000000 distutils and setuptools (paver.setuputils) — Paver 1.2.1 documentation

distutils and setuptools (paver.setuputils)

Paver makes it very easy to use and extend Python’s standard distribution mechanisms. The Getting Started Guide has a useful example of moving from distutils and setuptools to Paver.

Integrates distutils/setuptools with Paver.

paver.setuputils.find_package_data(where='.', package='', exclude=('*.py', '*.pyc', '*~', '.*', '*.bak', '*.swp*'), exclude_directories=('.*', 'CVS', '_darcs', './build', './dist', 'EGG-INFO', '*.egg-info'), only_in_packages=True, show_ignored=False)

Return a dictionary suitable for use in package_data in a distutils setup.py file.

The dictionary looks like:

{'package': [files]}

Where files is a list of all the files in that package that don’t match anything in exclude.

If only_in_packages is true, then top-level directories that are not packages won’t be included (but directories under packages will).

Directories matching any pattern in exclude_directories will be ignored; by default directories with leading ., CVS, and _darcs will be ignored.

If show_ignored is true, then all the files that aren’t included in package data are shown on stderr (for debugging purposes).

Note patterns use wildcards, or can be exact paths (including leading ./), and all searching is case-insensitive.

This function is by Ian Bicking.

paver.setuputils.install_distutils_tasks()

Makes distutils and setuptools commands available as Paver tasks.

paver.setuputils.setup(**kw)

Updates options.setup with the keyword arguments provided, and installs the distutils tasks for this pavement. You can use paver.setuputils.setup as a direct replacement for the distutils.core.setup or setuptools.setup in a traditional setup.py.

Previous topic

The Paver Standard Library

Next topic

File Handling in Paver (paver.path)

This Page

Paver-1.2.1/paver/docs/search.html0000644000175000017500000000657712152711213017160 0ustar almadalmad00000000000000 Search — Paver 1.2.1 documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

Paver-1.2.1/paver/docs/.buildinfo0000644000175000017500000000034612152711214016766 0ustar almadalmad00000000000000# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: 57be16135b520e1d745d4cef04824cf0 tags: a205e9ed8462ae86fdd2f73488852ba9 Paver-1.2.1/paver/docs/files.html0000644000175000017500000001410712152711213017001 0ustar almadalmad00000000000000 File Handling in Paver (paver.path) — Paver 1.2.1 documentation

File Handling in Paver (paver.path)

Wrapper around path.py to add dry run support and other paver integration.

paver.path.pushd(*args, **kwds)

A context manager (Python 2.5+ only) for stepping into a directory and automatically coming back to the previous one. The original directory is returned. Usage is like this:

from __future__ import with_statement
# the above line is only needed for Python 2.5

from paver.easy import *

@task
def my_task():
    with pushd('new/directory') as old_dir:
        ...do stuff...

Previous topic

distutils and setuptools (paver.setuputils)

Next topic

Documentation Tools (paver.doctools)

This Page

Paver-1.2.1/paver/docs/ssh.html0000644000175000017500000001200212152711213016464 0ustar almadalmad00000000000000 SSH Remote Access Support (paver.ssh) — Paver 1.2.1 documentation

SSH Remote Access Support (paver.ssh)

Functions for accessing remote hosts.

At present, these are implemented by calling ssh’s command line programs.

paver.ssh.scp(source, dest)

Copy the source file to the destination.

Previous topic

Using with Bazaar-NG (bzr) (paver.bzr)

Next topic

Paver Command Line

This Page

Paver-1.2.1/paver/docs/genindex.html0000644000175000017500000002153112152711213017477 0ustar almadalmad00000000000000 Index — Paver 1.2.1 documentation Paver-1.2.1/paver/docs/searchindex.js0000644000175000017500000004442412152711214017652 0ustar almadalmad00000000000000Search.setIndex({envversion:42,terms:{alo:7,all:[4,16,3,5,7,8,11,17],code:[4,16,3,5,14,8,17],jason:[4,16,17,14],chain:7,bugreport:5,consum:[7,5],some_module_existing_only_in_virtualenv:15,steve:5,signific:4,deprecationwarn:5,abil:[17,5],cheeseshop:4,follow:[7,9,8,17,5],scp:10,privat:4,pedro:5,depend:[4,17,5],system:[15,4,16,3,5,7,8,17],sensit:17,effort:[16,3],script_nam:15,elsewher:[7,5],readabl:[16,5],cmdopt:[7,17,5],send:[4,5],easiest:[4,7,17],common:[16,3],nonposit:5,program:[4,3,5,10,12,17],present:[17,10,5],under:[4,5,7,8,11,17],hermann:[14,5],jeremi:5,oldwai:17,testabl:17,worth:17,sent:7,"case":[13,7,8,11],file:[6,14,8,5],lack:5,everi:[17,3,16],string:[15,8,17],fals:[13,15,9,5,7,8,11,17],dessert:8,util:[4,8],mechan:[11,17,3,5],failur:5,delete_cod:[8,5],join:7,install_script:17,kitti:7,runnabl:17,doctool:5,recip:[16,3],magic:5,alma:5,level:[6,7,11,3,5],sectionnam:8,egg_info:[17,5],list:[15,4,3,9,5,6,7,8,11,17],upload:17,ryan:14,"try":[7,17,5],item:5,hasattr:7,bdist_egg:17,stderr:[11,5],intal:5,versioned_nam:9,elegantli:3,dir:15,pleas:4,cfg:17,direct:[11,5],past:17,zero:5,design:[4,16,3,14,7,17],benefici:5,pass:[13,4,5,7,8,17],download:4,further:[17,5],compat:5,index:[15,4,17,5],what:[7,17,3],hide:[4,17,5],appear:[6,8,5],neg:5,section:[7,8,17,5],advanc:3,abl:[7,17,3],invok:[4,7,17],upload_sphinx:17,current:[15,9,17,5],delet:[8,17,5],version:[15,4,16,9,5,7,8,17],ignore_error:5,build_pi:17,"new":[0,16,3,5],deploy_to_linux:7,ever:[4,5],method:[16,5],whatev:[17,3,16],elimin:[17,5],full:[8,5],themselv:17,behavior:5,gener:[15,4,9,5,7,8,17],error:[9,17,5],sophist:6,here:8,bodi:17,nedbatcheld:8,bdist_wininst:17,install_head:17,path:[14,16,5],along:[4,8],becom:[17,5],modifi:16,sinc:[4,8,17],valu:[13,6,7,17,5],dry:[0,6,17,16],convert:[13,1,17],purpos:[9,11,5],convers:17,larger:3,step:[0,17],everyon:3,prior:14,def:[0,4,16,7,12,15,17],within:[8,17],pick:17,action:17,opinion:5,chang:[8,16,17,5],commonli:17,overrid:[7,17],builtdoc:[7,17],via:[6,7,8,17,5],regardless:5,repositori:5,extra:[16,3],appli:5,modul:[13,1,16,9,4,5,14,12,17,18],bdist_dumb:17,prefer:[15,17,5],deprec:[15,5],api:16,rkupp:5,marker:[8,17,5],instal:[16,17,3,5],txt:[4,16,5],wilken:[14,5],unit:[4,17,5],quickstart:17,insert_output:17,from:[0,1,3,5,14,8],describ:[7,17,16],zip:[9,17,5],memori:8,path25:5,eyk:3,regist:17,upgrad:5,todai:16,next:[6,17,3],few:3,call:[4,8,17,3,5],taken:5,checkout:[13,5],tell:[4,7,17],tightli:16,more:[14,8,16,3,5],task1:5,task2:5,exit:[17,5],desir:8,python:[1,14,5],peopl:[3,5],relat:5,notic:17,enhanc:5,warn:5,dest_dir:15,"export":[13,5],depth:[1,4],sphinx_pypi_upload:17,autodoc:5,sens:[7,3],known:8,build_clib:17,hold:17,call_pav:5,cach:[8,5],must:[7,8],endsect:[8,17],none:[4,8],nao:5,word:6,augment:16,alia:17,setup:[16,3,5],work:[14,8,5],uniqu:8,cat:17,hostpath:17,can:[6,8,5],learn:4,sectionedfil:[8,5],root:[8,17,5],fulton:14,boilerpl:3,control:[8,5],prompt:17,encapsul:5,tar:17,give:[15,8,17],process:5,sdist:[4,17,16],share:[7,17,5],accept:[7,5],had:[17,5],critic:17,sourc:[4,5,7,8,10,17],aurelianito:5,want:[4,8,17,3],tarbal:[4,17,3,5],david:[3,5],lowri:5,doc_clean:[8,17],cours:[4,7,17,3],end:[7,8,17,3,5],goal:[16,5],manipul:16,quot:6,rather:[12,8,3,5],anoth:[6,5],comfort:17,georg:14,snippet:17,how:[1,16,3,4,5,17],actual:[6,17,5],pure:17,answer:3,instead:[15,4,17,5],config:[4,17,3,5],"__file__":5,chri:5,updat:[13,12,11,5],map:8,product:4,beginspec:8,alwai:[7,16,17,5],powerful_function_and_new_too:17,clone:4,after:[15,7,17,5],spot:[17,3],befor:[4,5,6,7,8,17],mac:5,rmtree:[7,17,5],attent:4,date:13,multipl:[6,17],underscor:13,data:[12,17,11],man:17,filename_under_includedir:8,github:[4,5],honestli:3,read:[12,17,3,16],jszakmeist:5,explicit:5,greet:7,foord:14,caus:5,inform:[4,7,8,17,12],"switch":5,includedir:[8,17],environ:[15,4,7,16,5],allow:[4,7,17,3,5],enter:[6,17],offend:5,no_auto:5,install_distutils_task:[17,11,5],egg:[11,17,3,5],order:[8,17,5],appropri:[7,5],oper:5,yedpodtrzitko:5,over:[17,5],move:[1,3,4,5,7,11,17],find:[17,5],no_site_packag:[15,5],fangl:17,newwai:[17,5],own:[7,8,16,3,5],scott:5,rememb:17,still:[4,17,5],pointer:14,paramet:[4,5],write:[1,17,5],style:[8,17],outer:8,thank:[4,17,3,5],fit:9,concis:16,subprocess:5,exact:11,fix:5,jim:14,fate:1,better:17,feel:16,window:[17,5],complex:[4,5],infrastructur:3,mail:4,main:[15,7,3],might:[7,17],easier:[4,16,17,3,5],wouldn:17,them:5,good:[16,17,9],recal:[1,17,5],thei:[13,4,16,3,5,6,7,17],handl:[14,5],auto:[6,12,5],supersed:8,guess:[16,3],handi:5,initi:[1,8,14],easy_instal:[15,4,9,17,5],"break":5,instanc:[7,5],packages_to_instal:15,front:5,now:[16,17,5],newdirectori:5,from_str:8,bryan:[14,5],somewher:3,name:[6,4,8,17,5],anyth:[8,17,11],simpl:[7,9,17,3,5],tetsuya:4,drop:[17,16],separ:[15,17,5],easili:[4,8,17,3,16],delport:5,each:[6,7,17,3,16],debug:[6,17,11,5],fulli:[4,7,5],disturbyt:5,attributeerror:5,side:5,mean:[6,7,8,17,5],kral:5,jython:5,just:[8,5],sourcedir:[7,8,17],regener:17,blueskyonmar:[4,17],py2app:5,idea:[17,5],adam:5,realli:17,redistribut:[17,3],usernam:[7,17],doug:1,happen:17,patch:[14,5],collector:7,special:17,out:[13,4,16,3,5,8,17],variabl:[15,17],matt:5,announc:1,twice:5,goe:[17,3],miss:[16,5],basedir:8,notat:[6,8,17],rossi:5,content:17,reverend:7,suitabl:11,rel:[8,17],print:[7,5],determin:17,get:[8,16,3,5],cwd:5,integr:[0,4,16,11],qualifi:7,afrev:5,insid:[7,17],workflow:17,driver:5,million:17,romano:5,given:[13,7,8,5],free:7,standard:[4,16,3,5,14,17],reason:[17,3,5],base:[15,4,17,14],pavementerror:[7,5],dictionari:[13,5,8,11,12,17],usual:[7,3,5],releas:[1,14,9,4,5],van:14,philip:14,mainpart:17,bask:17,md5:5,wai:[16,3,5],capabl:3,include_mark:[8,5],could:[16,17,5],traceback:[17,5],put:[16,3,5,6,8,17],intermingl:5,keep:[15,8,17,5],thing:[4,7,17,3],place:[15,17,5],unabl:5,outsid:8,enough:[7,17,9],regress:5,confus:7,think:17,juergen:[14,5],origin:[0,14],softwar:3,almad:17,obviou:14,grade:3,onc:[7,17,5],number:[7,17,5],thereof:5,yourself:4,unlik:[17,5],alreadi:[17,3],done:[7,16,17,18],least:[17,5],stabl:4,python2:5,massiv:4,open:[14,17,9],build_ext:17,hood:17,my_task:[0,7],prioriti:17,avail:[4,16,9,5,6,7,8,11,12,17],differ:[6,8,3,9],ian:[14,11],convent:17,script:[3,5],unknown:5,top:[7,17,11,5],mkdir:5,sometim:7,wrapper:0,binari:[13,17],necessarili:16,too:[4,14],natur:17,toolset:3,find_package_data:[14,7,11],conveni:[13,4,17,5],"final":[7,17,3],store:[4,12,17],inner:8,assign:7,orendorff:[4,16,17,14],option:[15,3,9,5,6,7,8,11,12,17],namespac:[7,8,5],travi:5,copi:[17,10],setuptool:[4,16,3,5,7,17,18],specifi:[13,15,3,5,7,17],exclus:17,part:[6,16,17,3,5],pars:6,optionnam:6,off:[17,3,5],attract:5,than:[16,3,5,6,8,12],wide:[4,14],kind:[13,17,3],fullfil:7,target:5,keyword:[11,5],whenev:[17,5],remot:[4,18],gotten:14,remov:[8,16,17,5],tree:7,second:17,charact:[8,5],project:[1,14,8,16,5],greg:[14,5],greet_us:7,were:5,other:[0,4,16,3,9,5,7,17],make_opt:7,steer:14,seri:1,mini:[16,17,9],sai:[17,16],bootstrap:[15,4,17,3,5],nicer:[17,5],terribl:17,ran:7,well:[7,17,3,5],modern:17,argument:[4,5],packag:[15,4,16,3,5,14,7,11,17],pip:[15,4,5],manner:7,have:[14,8,16,3,5],close:5,need:[0,4,16,3,5,6,7,17],seen:17,seem:[14,17,16],turn:5,kevin:[4,7,17,3,14],mislead:5,entireti:17,built:[4,7,8,17],equival:[6,7,17],consume_arg:[7,5],bick:[14,11],rout:5,mid:4,note:[5,6,7,8,11,17],also:[4,3,5,14,7,8,17],ideal:[4,17],maintain:3,matthew:5,take:[14,8,5],which:[15,5,6,7,8,17],hatch:3,distutils_:4,green:[14,5],build_script:17,noth:[6,7],singl:8,even:[4,17,3,5],courtesi:5,sure:[16,17,3,5],unless:7,distribut:[15,4,17,11,5],though:[14,17],track:[4,8],glob:8,who:5,clearer:5,paid:4,"short":7,most:[4,17,5],larg:17,plan:14,deploi:[7,17,9],bsd:4,pyc:[11,5],"class":[8,5],builddir:[7,8,17],tradit:11,wilcox:14,bug:5,url:[13,4,5,7,15,17],doc:[14,8,5],later:[7,5],cover:7,destruct:6,doe:[13,6,17,3,5],inde:17,consol:7,declar:5,runtim:5,clean:[14,7,8,17],distutils_script:5,voodoo:5,effect:5,left:3,doctest:17,ned:[14,17,5],fact:7,translat:[4,5],"_build":17,show:17,text:[7,8],alphanumer:5,comand:5,syntax:5,bring:[17,3],directli:[7,17,3],entry_point:7,fine:7,anywai:17,rotat:17,involv:3,access:[4,3,5,8,17,18],onli:[0,4,13,5,6,7,15,17],consume_narg:[7,5],locat:[4,9,5],nois:7,pretti:[4,3],configur:[12,3],solut:3,state:3,technic:1,builddoc:17,stand:17,dict:7,templat:17,"__call__":5,zip_saf:7,first:[7,17,5],meant:7,nosetest:17,variou:14,distinctli:5,familiar:17,superse:7,express:16,watch:5,becaus:[8,17,5],cannot:8,ssh:[4,18,17,5],shown:[6,11],report:5,requir:5,setup_command:17,bar:6,enabl:17,bloat:17,baz:6,yield:[8,5],"public":[4,5],provid:[16,3,5,6,7,8,11,14,17],bad:[4,5],stuff:[0,7,17],spam:7,aris:17,arfrev:5,contain:[4,9,8,17,5],through:5,metadata:[12,3],where:[8,5],seamlessli:5,wrote:14,pmcnr:5,set:[4,3,9,5,6,7,8,17],sitepen:[4,3],knowledg:5,ebi:14,dangoor:[4,7,17,3,14],scriptabl:16,see:[4,8,17,3,5],dumb:17,result:[8,17,5],arg:[0,7],fail:5,mycoolproject:4,retriev:13,best:16,gmail:[4,7,17],unzip:15,flexibl:14,kei:[6,7,17],correctli:5,hopefulli:5,pattern:[8,11,3],review:5,exist:[13,7,17,5],mud:3,behind:[17,9],won:[8,11,5],between:[7,8,17,5],"import":[0,4,9,5,6,7,12,15,17],awai:7,bunch:[7,17,3,5],across:8,attribut:[7,17],call_task:[7,16,17,5],accord:17,grandpar:5,bound:5,appreci:4,extend:[17,11,16],taskopt:[6,17],"_darc":11,isol:[16,3],pypi:[4,17,5],extens:[8,17,3,9],job:[7,16],entir:[8,3],measur:9,solv:[17,3],group:9,let:[7,8,16,17,5],come:[0,5],problem:[17,3,5],addit:[15,5],both:[15,4,5,14,7,17],mycool:4,someth:[4,16,3,5,6,7],howev:7,lazi:5,against:[8,17,5],configpars:12,etc:[17,3],hidden_depend:7,package_data:[7,11],decid:7,cog:[1,14,8,17,5],collect:[16,17,3,5],uncaught:5,swallow:5,browser:[17,9],whole:8,overwrit:5,comment:[8,5],author:[4,7,17,14],space:[13,6,8],figur:16,tgz:4,sweet:3,unittest:4,htmldir:17,header:17,non:5,suppli:17,respect:7,guid:[4,11,17,3,5],rpm:17,batcheld:[14,17,5],duplic:3,"0a1":1,fanci:16,creat:[16,3,5],coupl:17,marc:[14,5],unzip_setuptool:[15,5],help:[6,17,5],rebuild:3,index_url:15,altern:5,three:[7,17],been:[4,16,3,5,14,17],mark:[17,5],whom:7,much:[6,7,16,3],destin:[13,15,17,10,5],interest:17,show_ignor:11,unambigu:7,swp:11,tasknam:[6,17],popul:15,quickli:18,wish:[17,5],setopt:17,search:[15,4,5,8,11,17],uncommon:3,ani:[13,5,6,7,8,11],system_site_packag:15,morimoto:4,togeth:[16,3],els:[7,8],repetit:4,makedir:5,those:[16,3,5,14,8,17],celkem:17,sound:[17,3],look:[15,1,9,5,7,8,11,17],raw:5,awesom:16,servic:3,properti:[8,17,5],trick:4,defin:[4,8,17,5],"while":[17,9],unifi:5,abov:[0,7,17],guido:14,build_sphinx:17,certainli:[17,16],scene:[17,9],ill:1,loop:[16,17,3,5],propag:[17,5],would:[3,5,14,7,8,17],coher:17,advantag:14,thecod:17,almost:14,readm:17,config_data:12,worri:17,quiet:[6,17],blah:16,paver_command_lin:15,olddirectori:5,honza:5,conf:5,"return":[0,13,5,8,11,17],revis:[13,5],mani:[7,12,5],ship:[17,5],sever:18,uncog:[8,17,5],old_dir:0,decor:[15,7,17,3,5],mytask:7,develop:17,descent:3,avz:17,minim:5,perform:[13,17,16],suggest:5,make:[1,14,16,5],same:[7,8,17,3,5],preserv:5,when:[15,16,3,5,7,8,12,17],html:[4,7,8,17,5],sentenc:5,document:[1,5],start:[8,3,5],conflict:7,complet:[4,17],week:1,rake:[4,17],http:[4,8,17,5],context:[0,5],imagin:16,nest:[8,17],assist:14,upon:14,someon:17,hand:17,middl:7,fairli:[7,17],issu:[4,5],rais:[7,5],temporari:[17,9],user:[4,3,9,14,7,17],forb:[14,5],improv:[4,5],extern:[8,17,5],build:[4,16,3,5,6,7,8,11,17],distutil:[16,3,5],weird:17,tune:7,recent:4,underneath:5,lower:13,task:[0,16,14,5,6,8],kept:8,older:[4,17],sibson:[14,5],com:[4,7,8,17,5],thu:4,pewtei:7,without:[4,14,5,6,7,8],exampl:[8,16,3,5],command:5,log:[7,17,5],thi:[0,4,13,9,5,7,8,11,12,15,17],choos:[15,17],great:[4,16,17,3,14],everyth:[17,3,5],thornton:[14,5],latest:4,load:8,newest:17,entri:17,execut:[17,5],tip:4,exclud:11,endspec:8,sampl:[4,17,3,5],settabl:5,virtual:[4,18,5],aspect:7,question:3,bak:11,piet:5,languag:[14,17,3,16],kwd:0,web:[17,9],cut:17,miscellan:4,easi:5,point:[13,6,17,5],makefil:17,except:[17,5],shortcut:[17,5],elia:5,rst:[8,17],add:[0,4,3,9,5,7,17],virtualenv_distribut:15,neat:17,buildsdist:17,host1:17,input:14,save:17,transit:4,match:[7,8,17,11],gave:17,earli:7,applic:4,cramer:5,zipimport:5,around:[0,4,17,6],paverdoc:[7,9,17,5],format:5,dest:[13,10],untar:4,piec:17,leonhandrek:5,five:16,know:[4,17,3,5],background:1,mysect:8,bit:5,password:17,help_funct:7,extra_fil:9,say_hello:7,insert:7,like:[0,4,16,3,5,7,8,11,12,17],specif:[7,8,17],filenam:[9,8,17,5],install_data:17,should:[15,7,17,3,5],cool:17,rossum:14,manual:4,resolv:5,server:[7,17],michael:[14,5],pavement:[6,4,9,17,5],"boolean":7,either:[4,7,17,5],choic:[15,12],output:[6,9,8,17,5],install_requir:[7,5],manag:[0,4,15,3,5],two:[7,8,17,3,5],deployopt:17,bundl:5,bdist_rpm:17,www:[4,17],didn:3,old:5,often:[8,17,3,16],captur:5,interact:[4,17],some:[4,16,3,9,7,8,17],begin:8,destdir:[7,17],global:[15,6,7,17,5],understood:3,previou:[0,7,5],with_stat:0,pushd:[0,5],host2:17,flush:5,proper:17,resembl:5,manifest:[17,5],librari:14,virtualenv:[4,18,16,3,5],rsync:17,total:16,buildout:[16,3,5],endoutput:8,lead:[4,14,11,5],might_cal:[7,5],assum:[7,12,9],avoid:[7,9,5],deploy:[16,3],arthur:7,japanes:[4,5],leav:17,rmdir:5,launch:12,condit:17,unbeliev:4,foo:[6,7,8],outl:8,refer:[7,8,17,5],core:[17,11,5],particular:15,object:[7,8,17,5],run:[0,16,5,6,8,17],power:17,quit:[7,17,16],bdist:17,usag:[0,8,17],ultim:5,trivial:4,find_link:15,speak:7,broken:[17,5],host:[17,10],nutshel:8,install_egg_info:17,found:8,docroot:[8,17],major:5,"super":17,don:[6,8,16,3],continu:17,coder:14,kry:[14,5],foo_instead_of_spam_and_egg:7,greatli:5,incorpor:[4,5],deadlock:5,surround:[3,5],page:4,optpars:7,addition:5,messag:[6,5],only_in_packag:[7,11],commit:[8,5],luck:16,produc:1,block:8,setupsool:17,checkup:[13,5],compil:17,"__future__":0,paverimporterror:5,consid:7,hardli:16,simplifi:5,contriv:17,console_script:7,automat:[0,4,16,5,12,15,17],due:5,theoldwai:17,right:17,empti:[8,17,5],exclude_directori:11,strip:5,wrap:4,subvers:[4,18],your:[15,4,16,3,9,5,7,8,17,18],occupi:3,inclus:14,git:4,fill:17,minilib:[4,9,17,5],real:5,pictur:5,aren:11,support:[0,4,16,3,5,7,17,18],install_lib:17,"long":[7,17,3,5],custom:[4,16,17,3,5],verbos:[6,17],remaind:7,again:[8,5],interfac:3,includ:[13,15,16,9,5,14,7,8,11,17,18],lot:[14,16,5],replac:[8,16,11,5],pipe:5,typic:17,hostymost:17,test_suit:7,"function":[13,3,5,14,7,8,10,11,17],svn:[4,18,5],properli:[17,5],repeatedli:3,form:5,offer:17,tupl:7,buildfailur:[8,17,5],basic:[17,3,5],bother:3,back:[0,8,5],long_usernam:7,setup_environ:7,link:[17,5],detect:5,no_help:[7,5],renam:5,line:5,inlin:17,"true":[13,9,11,5],rebuilt:4,dist:[17,11],info:[13,5,6,7,11,17],pull:4,made:5,callabl:5,possibl:[3,5],whether:13,type:[8,17],displai:[6,9,8,17,5],until:[17,9],directori:[0,4,16,3,9,5,8,11,15,17],site:[15,4,17,5],otherwis:[13,16,9,6,7,17],embed:4,strategi:17,similar:[7,17,3,5],welcom:17,bell:7,gone:[8,5],featur:5,hellman:1,share_with:7,evalu:5,generate_setup:[9,17,5],"int":7,certain:7,parser:12,nose:[7,17],doesn:5,mode:17,dear:7,setuputil:[4,9,5,14,7,17,18],implement:[10,5],ini:12,glanc:17,request:[4,8],encompass:4,ing:5,no_index:15,check:[13,4,17,3,5],fixup:17,saveopt:17,mutual:17,beyond:3,googl:5,burrough:5,author_email:[4,7,17],hybrid:7,detail:[6,17],invalid:5,"default":[15,4,9,5,7,8,11,17],do_cleanup:7,bracket:8,collis:5,normal:[13,5],varieti:[14,5],test:[14,17,5],you:[6,8,16,3,5],mock:14,nice:[17,3,5],fork:4,pavement_fil:5,wildcard:11,lend:17,misctask:[4,17,5],forgot:[17,5],docstr:17,sphinxdoc:5,insensit:11,cpython:5,brandl:14,veri:[16,11,5],thenewwai:17,deserv:14,reduc:[7,3,5],sphinx:[1,16,4,5,7,8,17],longer:[17,5],nakashima:5,prefer_easy_instal:15,descript:[7,5],rule:7,itself:[15,4,17,3],emerg:3,ignor:[15,11,5],dot:[6,8,17,5],time:[17,3],push:5,escap:3,backward:[4,5],hello:7,builout:3},objtypes:{"0":"py:module","1":"py:function","2":"py:attribute","3":"py:class"},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","attribute","Python attribute"],"3":["py","class","Python class"]},filenames:["files","articles","bzr","foreword","index","changelog","cmdline","pavement","doctools","misctasks","ssh","setuptools","tips","svn","credits","virtualenv","features","getting_started","paverstdlib"],titles:["File Handling in Paver (paver.path)","Articles about Paver","Using with Bazaar-NG (bzr) (paver.bzr)","Foreword: Why Paver?","Paver: Easy Scripting for Software Projects","Paver Changelog","Paver Command Line","pavement.py in depth","Documentation Tools (paver.doctools)","Miscellaneous Tasks (paver.misctasks)","SSH Remote Access Support (paver.ssh)","distutils and setuptools (paver.setuputils)","Tips and Tricks","Using with Subversion (paver.svn)","Credits","Virtualenv Support (paver.virtual)","Paver’s Features","Getting Started with Paver","The Paver Standard Library"],objects:{paver:{svn:[13,0,1,""],misctasks:[9,0,1,""],setuputils:[11,0,1,""],virtual:[15,0,1,""],doctools:[8,0,1,""],ssh:[10,0,1,""],path:[0,0,1,""]},"paver.setuputils":{setup:[11,1,1,""],install_distutils_tasks:[11,1,1,""],find_package_data:[11,1,1,""]},"paver.ssh":{scp:[10,1,1,""]},"paver.virtual":{virtualenv:[15,1,1,""],bootstrap:[15,1,1,""]},"paver.svn":{checkup:[13,1,1,""],"export":[13,1,1,""],info:[13,1,1,""],checkout:[13,1,1,""],update:[13,1,1,""]},"paver.doctools":{doc_clean:[8,1,1,""],SectionedFile:[8,3,1,""],Includer:[8,3,1,""],html:[8,1,1,""],cog:[8,1,1,""],uncog:[8,1,1,""]},"paver.doctools.SectionedFile":{all:[8,2,1,""]},"paver.path":{pushd:[0,1,1,""]},"paver.misctasks":{paverdocs:[9,1,1,""],generate_setup:[9,1,1,""],minilib:[9,1,1,""]}},titleterms:{help:4,just:[17,16],syntax:16,yet:17,paramet:7,access:10,depend:7,miscellan:9,easi:[4,16,3],fix:17,april:5,articl:1,them:16,march:5,get:17,handl:0,ssh:10,octob:5,bit:16,requir:16,doctool:8,name:7,changelog:5,didn:17,manual:7,bonu:17,pavement:7,small:16,januari:5,where:17,set:12,old:17,our:17,librari:[16,18],compat:17,project:[4,3],statu:4,hide:7,februari:5,content:4,"new":17,wart:17,run:4,august:5,foreword:3,here:[17,3],standard:18,path:0,bazaar:2,about:1,credit:14,amount:16,support:[15,10],oper:16,softwar:4,instal:4,"0a1":5,"0a2":5,"0a3":5,from:17,advantag:16,wai:17,script:[4,17],paver:[0,1,2,3,4,5,6,8,9,10,11,13,15,16,17,18],licens:4,tackl:17,subvers:13,start:17,call:7,suit:4,hei:17,more:[7,17],shell:17,python:16,peopl:17,juli:5,relat:3,setuptool:11,doesn:16,line:[6,7],"0b1":5,consist:3,remot:10,setup:17,work:[7,17,16],imper:3,trick:12,defin:7,can:16,behavior:16,featur:[4,16],have:17,creat:17,argument:7,indic:4,setuputil:11,file:[0,12,16],tabl:4,rid:17,declar:3,develop:4,"0a4":5,anoth:17,make:3,tip:12,"switch":3,virtual:15,how:7,complex:7,take:16,test:4,you:17,document:8,config:12,tool:8,virtualenv:15,deploy:17,june:5,mai:5,distutil:[17,11],why:3,svn:13,task:[15,7,3,9],don:17,bzr:2,doc:17,divid:3,depth:7,exampl:17,command:[6,7],misctask:9}})Paver-1.2.1/paver/docs/getting_started.html0000644000175000017500000012524112152711213021070 0ustar almadalmad00000000000000 Getting Started with Paver — Paver 1.2.1 documentation

Getting Started with Paver

Often, the easiest way to get going with a new tool is to see an example in action, so that’s how we’ll get started with Paver. In the Paver distribution, there are samples under docs/samples. The Getting Started samples are in the “started” directory under there.

The Old Way

Our first sample is called “The Old Way” (and it’s in the docs/samples/started/oldway directory). It’s a fairly typical project with one Python package and some docs, and we want to be able to distribute it.

Python’s distutils makes it easy indeed to create a distributable package. We create a setup.py file that looks like this:

#<== include('started/oldway/setup.py')==>
from distutils.core import setup

setup(
    name="TheOldWay",
    packages=['oldway'],
    version="1.0",
    url="http://www.blueskyonmars.com/",
    author="Kevin Dangoor",
    author_email="dangoor@gmail.com"
)
#<==end==>

With that simple setup script, you can run:

python setup.py sdist

to build a source distribution:

# <==
# sh('cd docs/samples/started/oldway; python setup.py sdist',
#    insert_output=False)
# sh('ls -l docs/samples/started/oldway/dist')
# ==>
celkem 4
-rw-r--r-- 1 almad almad 637  2.en 20.44 TheOldWay-1.0.tar.gz
# <==end==>

Then your users can run the familiar:

python setup.py install

to install the package, or use setuptools’ even easier:

easy_install "TheOldWay"

for packages that are up on the Python Package Index.

The Old Way’s Docs

The Old Way project is at least a bit modern in that it uses Sphinx for documentation. When you use sphinx-quickstart to get going with your docs, Sphinx will give you a Makefile that you can run to generate your HTML docs. So, generating the HTML docs is easy:

make html

Except, in this project (as in Paver itself), we want to include the HTML files in a docs directory in the package for presenting help to the users. We end up creating a shell script to do this:

# <== include("started/oldway/builddocs.sh")==>
cd docs
make html
cd ..
rm -rf oldway/docs
mv docs/_build/html oldway/docs
# <==end==>

Of course, creating a script like this means that we have to actually remember to run it. We could change this script to “buildsdist.sh” and add a python setup.py sdist to the end of the file. But, wouldn’t it be nicer if we could just use python setup.py sdist directly?

You can create new distutils commands, but do you really want to drop stuff like that in the distutils/command package in your Python library directory? And how would you call the sdist command anyway? setuptools helps, but it still requires setting up a module and entry point for this collection of commands.

Work with me here

I just know there are some people reading this and thinking “man, what a contrived example!”. Building, packaging, distributing and deploying of projects is quite custom for every project. Part of the point of Paver is to make it easy to handle whatever weird requirements arise in your project. This example may seem contrived, but it should give you an idea of how easy Paver makes it to get your tasks done.

The New Way

Let’s bring in Paver now to clean up our scripting a bit. Converting a project to use Paver is really, really simple. Recall the setup function from our Old Way setup.py:

# <== include("started/oldway/setup.py", "setup")==>
setup(
    name="TheOldWay",
    packages=['oldway'],
    version="1.0",
    url="http://www.blueskyonmars.com/",
    author="Kevin Dangoor",
    author_email="dangoor@gmail.com"
)
# <==end==>

Getting Started with Paver

setup.py is a standard Python script. It’s just called setup.py as a convention. Paver works a bit more like Make or Rake. To use Paver, you run paver <taskname> and the paver command will look for a pavement.py file in the current directory. pavement.py is a standard Python module. A typical pavement will import from paver.easy to get a bunch of convenience functions and objects and then import other modules that include useful tasks:

# <== include('started/newway/pavement.py', 'imports')==>
from paver.easy import *
import paver.doctools
from paver.setuputils import setup
# <==end==>

Converting from setup.py to pavement.py is easy. Paver provides a special options object that holds all of your build options. options is just a dictionary that allows attribute-style access and has some special searching abilities. The options for distutils operations are stored in a setup section of the options. And, as a convenience, Paver provides a setup function that sets the values in that options section (and goes a step further, by making all of the distutils/setuptools commands available as Paver tasks). Here’s what the conversion looks like:

# <== include('started/newway/pavement.py', 'setup')==>
setup(
    name="TheNewWay",
    packages=['newway'],
    version="1.0",
    url="http://www.blueskyonmars.com/",
    author="Kevin Dangoor",
    author_email="dangoor@gmail.com"
)
# <==end==>

Paver is compatible with distutils

Choosing to use Paver does not mean giving up on distutils or setuptools. Paver lets you continue to use distutils and setuptools commands. When you import a module that has Paver tasks in it, those tasks automatically become available for running. If you want access to distutils and setuptools commands as well, you can either use the paver.setuputils.setup function as described above, or call paver.setuputils.install_distutils_tasks().

We can see this in action by looking at paver help:

# <== sh('cd docs/samples/started/newway; paver help')==>
---> paver.tasks.help
Usage: paver [global options] taskname [task options] [taskname [taskoptions]]

Options:
  --version             show program's version number and exit
  -n, --dry-run         don't actually do anything
  -v, --verbose         display all logging output
  -q, --quiet           display only errors
  -i, --interactive     enable prompting
  -f FILE, --file=FILE  read tasks from FILE [pavement.py]
  -h, --help            display this help information
  --propagate-traceback
                        propagate traceback, do not hide it under
                        BuildFailure(for debugging)

Tasks from paver.doctools:
  doc_clean        - Clean (delete) the built docs

Tasks from setuptools.command:
  build_py         - "build" pure Python modules (copy to build directory)

Tasks from paver.misctasks:
  paverdocs        - Open your web browser and display Paver's documentation.

Tasks from setuptools.command:
  test             - run unit tests after in-place build

Tasks from paver.doctools:
  cog              - Runs the cog code generator against the files matching your
    specification

Tasks from setuptools.command:
  bdist_rpm        - create an RPM distribution

Tasks from paver.doctools:
  uncog            - Remove the Cog generated code from files

Tasks from setuptools.command:
  install_egg_info - Install an .egg-info directory for the package

Tasks from distutils.command:
  build_clib       - build C/C++ libraries used by Python extensions

Tasks from setuptools.command:
  saveopts         - save supplied options to setup.cfg or other config file

Tasks from distutils.command:
  build_scripts    - "build" scripts (copy and fixup #! line)

Tasks from paver.misctasks:
  minilib          - Create a Paver mini library that contains enough for a simple
    pavement.py to be installed using a generated setup.py

Tasks from distutils.command:
  bdist_dumb       - create a "dumb" built distribution

Tasks from paver.misctasks:
  generate_setup   - Generates a setup.py file that uses paver behind the scenes

Tasks from setuptools.command:
  egg_info         - create a distribution's .egg-info directory

Tasks from sphinx_pypi_upload:
  upload_sphinx    - Upload Sphinx documentation to PyPI

Tasks from setuptools.command:
  bdist_egg        - create an "egg" distribution

Tasks from nose.commands:
  nosetests        - Run unit tests using nosetests

Tasks from distutils.command:
  check            - perform some checks on the package

Tasks from setuptools.command:
  register         - register the distribution with the Python package index

Tasks from paver.tasks:
  help             - This help display.

Tasks from setuptools.command:
  alias            - define a shortcut to invoke one or more commands
  rotate           - delete older distributions, keeping N newest files

Tasks from paver.doctools:
  html             - Build HTML documentation using Sphinx

Tasks from setuptools.command:
  easy_install     - Find/get/install Python packages

Tasks from distutils.command:
  install_headers  - install C/C++ header files
  install_data     - install data files

Tasks from setuptools.command:
  build_ext        - build C/C++ extensions (compile/link to build directory)
  develop          - install package in 'development mode'

Tasks from distutils.command:
  build            - build everything needed to install

Tasks from sphinx.setup_command:
  build_sphinx     - Build Sphinx documentation

Tasks from setuptools.command:
  install_lib      - install all Python modules (extensions and pure Python)
  bdist_wininst    - create an executable installer for MS Windows
  install_scripts  - install scripts (Python or otherwise)
  setopt           - set an option in setup.cfg or another config file

Tasks from distutils.command:
  upload           - upload binary package to PyPI
  clean            - clean up temporary files from 'build' command

Tasks from setuptools.command:
  sdist            - create a source distribution (tarball, zip file, etc.)

Tasks from distutils.command:
  bdist            - create a built (binary) distribution

Tasks from setuptools.command:
  install          - install everything from build directory

Tasks from pavement:
  sdist            - Overrides sdist to make sure that our setup.py is generated.
  html             - Build the docs and put them into our package.
  deploy           - Deploy the HTML to the server.
# <==end==>

That command is listing all of the available tasks, and you can see near the top there are tasks from distutils.command. All of the standard distutils commands are available.

There’s one more thing we need to do before our Python package is properly redistributable: tell distutils about our special files. We can do that with a simple MANIFEST.in:

# <== include('started/newway/MANIFEST.in')==>
include setup.py
include pavement.py
include paver-minilib.zip
# <==end==>

With that, we can run paver sdist and end up with the equivalent output file:

# <==
# sh('cd docs/samples/started/newway; paver sdist',
#    insert_output=False)
# sh('ls -l docs/samples/started/newway/dist')
# ==>
celkem 48
-rw-r--r-- 1 almad almad 45726  2.en 20.44 TheNewWay-1.0.tar.gz
# <==end==>

It also means that users of The New Way can also run paver install to install the package on their system. Neat.

But people are used to setup.py!

python setup.py install has been around a long time. And while you could certainly put a README file in your package telling people to run paver install, we all know that no one actually reads docs. (Hey, thanks for taking the time to read this!)

No worries, though. You can run paver generate_setup to get a setup.py file that you can ship in your tarball. Then your users can run python setup.py install just like they’re used to, and Paver will take over.

But people don’t have Paver yet!

There are millions of Python installations that don’t have Paver yet, but have Python and distutils. How can they run a Paver-based install?

Easy, you just run paver minilib and you will get a file called paver-minilib.zip. That file has enough of Paver to allow someone to install most projects. The Paver-generated setup.py knows to look for that file and use it if it sees it.

Worried about bloating your package? The paver-minilib is not large:

# <==
# sh('cd docs/samples/started/newway ; paver minilib',
#    insert_output=False)
# sh('ls -l docs/samples/started/newway/paver-minilib.zip')
# ==>
-rw-r--r-- 1 almad almad 44375  2.en 20.44 docs/samples/started/newway/paver-minilib.zip
# <==end==>

Paver itself is bootstrapped with a generated setup file and a paver-minilib.

Hey! Didn’t you just create more work for me?

You might have noticed that we now have three commands to run in order to get a proper distribution for The New Way. Well, you can actually run them all at once: paver generate_setup minilib sdist. That’s not terrible, but it’s also not great. You don’t want to end up with a broken distribution just because you forgot one of the tasks.

By design, one of the easiest things to do in Paver is to extend the behavior of an existing “task”, and that includes distutils commands. All we need to do is create a new sdist task in our pavement.py:

# <== include('started/newway/pavement.py', 'sdist')==>
@task
@needs('generate_setup', 'minilib', 'setuptools.command.sdist')
def sdist():
    """Overrides sdist to make sure that our setup.py is generated."""
    pass
# <==end==>

The @task decorator just tells Paver that this is a task and not just a function. The @needs decorator specifies other tasks that should run before this one. You can also use the call_task(taskname) function within your task if you wish. The function name determines the name of the task. The docstring is what shows up in Paver’s help output.

With that task in our pavement.py, paver sdist is all it takes to build a source distribution after generating a setup file and minilib.

Note

If you are depending on distutils task (via @needs), you have to call setup() before task is defined. Under the hood, setup call installs distutils/setupsools task and make them available, so do not make it conditional.

Tackling the Docs

Until the tools themselves provide tasks and functions that make creating pavements easier, Paver’s Standard Library will include a collection of modules that help out for commonly used tools. Sphinx is one package for which Paver has built-in support.

To use Paver’s Sphinx support, you need to have Sphinx installed and, in your pavement.py, import paver.doctools. Just performing the import will make the doctools-related tasks available. paver help html will tell us how to use the html command:

# <== sh('paver help paver.doctools.html')==>
---> paver.tasks.help

paver.doctools.html
-------------------
Usage: paver paver.doctools.html [options]

Options:
  -h, --help  display this help information

Build HTML documentation using Sphinx. This uses the following
    options in a "sphinx" section of the options.

    docroot
      the root under which Sphinx will be working. Default: docs
    builddir
      directory under the docroot where the resulting files are put.
      default: build
    sourcedir
      directory under the docroot for the source files
      default: (empty string)


# <==end==>

According to that, we’ll need to set the builddir setting, since we’re using a builddir called “_build”. Let’s add this to our pavement.py:

# <== include('started/newway/pavement.py', 'sphinx')==>
options(
    sphinx=Bunch(
        builddir="_build"
    )
)
# <==end==>

And with that, paver html is now equivalent to make html using the Makefile that Sphinx gave us.

Getting rid of our docs shell script

You may remember that shell script we had for moving our generated docs to the right place:

# <== include('started/oldway/builddocs.sh')==>
cd docs
make html
cd ..
rm -rf oldway/docs
mv docs/_build/html oldway/docs
# <==end==>

Ideally, we’d want this to happen whenever we generate the docs. We’ve already seen how to override tasks, so let’s try that out here:

# <== include('started/newway/pavement.py', 'html')==>
@task
@needs('paver.doctools.html')
def html(options):
    """Build the docs and put them into our package."""
    destdir = path('newway/docs')
    destdir.rmtree()
    builtdocs = path("docs") / options.builddir / "html"
    builtdocs.move(destdir)
# <==end==>

There are a handful of interesting things in here. The equivalent of ‘make html’ is the @needs(‘paver.doctools.html’), since that’s the task we’re overriding.

Inside our task, we’re using “path”. This is a customized version of Jason Orendorff’s path module. All kinds of file and directory operations become super-simple using this module.

We start by deleting our destination directory, since we’ll be copying new generated files into that spot. Next, we look at the built docs directory that we’ll be moving:

# <== include('started/newway/pavement.py', 'html.builtdocs')==>
builtdocs = path("docs") / options.builddir / "html"
# <==end==>

One cool thing about path objects is that you can use the natural and comfortable ‘/’ operator to build up your paths.

The next thing we see here is the accessing of options. The options object is available to your tasks. It’s basically a dictionary that offers attribute-style access and can search for variables (which is why you can type options.builddir instead of the longer options.sphinx.builddir). That property of options is also convenient for being able to share properties between sections.

And with that, we eliminate the shell script as a separate file.

Fixing another wart in The Old Way

In the documentation for The Old Way, we actually included the function body directly in the docs. But, we had to cut and paste it there. Sphinx does offer a way to include an external file in your documentation. Paver includes a better way.

There are a couple of parts to the documentation problem:

  1. It’s good to have your code in separate files from your docs so that the code can be complete, runnable and, above all, testable programs so that you can be sure that everything works.
  2. You want your writing and the samples included with your writing to stand up as reasonable, coherent documents. Python’s doctest style does not always lend itself to coherent documents.
  3. It’s nice to have the code sample that you’re writing about included inline with the documents as you’re writing them. It’s easier to write when you can easily see what you’re writing about.

#1 and #3 sound mutually exclusive, but they’re not. Paver has a two part strategy to solve this problem. Let’s look at part of the index.rst document file to see the first part:

# <== include("started/newway/docs/index.rst", "mainpart")==>
Welcome to The New Way's documentation!
=======================================

This is the Paver way of doing things. The key functionality here
is in this powerful piece of code, which I will `include` here in its entirety
so that you can bask in its power::

  # [[[cog include("newway/thecode.py", "code")]]]
  # [[[end]]]

# <==end==>

In The New Way’s index.rst, you can see the same mechanism being used that is used in this Getting Started guide. Paver includes Ned Batchelder’s Cog package. Cog lets you drop snippets of Python into a file and have those snippets generate stuff that goes into the file. Unlike a template language, Cog is designed so that you can leave the markers in and regenerate as often as you need to. With a template language, you have the template and the finalized output, but not a file that has both.

So, as I’m writing this Getting Started document, I can glance up and see the index.rst contents right inline. You’ll notice The #[[[cog part in there is calling an include() function. This is the second part offered by Paver. Paver lets you specify an “includedir” for use with Cog. This lets you include files relative to that directory. And, critically, it also lets you mark off sections of those files so that you can easily include just the part you want. In the example above, we’re picking up the ‘code’ section of the newway/thecode.py file. Let’s take a look at that file:

# <== sh("cat docs/samples/started/newway/newway/thecode.py") ==>
"""This is our powerful, code-filled, new-fangled module."""

# [[[section code]]]
def powerful_function_and_new_too():
    """This is powerful stuff, and it's new."""
    return 2*1
# [[[endsection]]]
# <==end==>

Paver has a Cog-like syntax for defining named sections. So, you just use the include function with the relative filename and the section you want, and it will be included. Sections can even be nested (and you refer to nested sections using familiar dotted notation).

Bonus Deployment Example

pavements are just standard Python. The syntax for looping and things like that are just what you’re used to. The options are standard Python so they can contain lists and other objects. Need to deploy to multiple hosts? Just put the hosts in the options and loop over them.

Let’s say we want to deploy The New Way project’s HTML files to a couple of servers. This is similar to what I do for Paver itself, though I only have one server. First, we’ll set up some variables to use for our deploy task:

# <== include('started/newway/pavement.py', 'deployoptions')==>
options(
    deploy = Bunch(
        htmldir = path('newway/docs'),
        hosts = ['host1.hostymost.com', 'host2.hostymost.com'],
        hostpath = 'sites/newway'
    )
)
# <==end==>

As you can see, we can put whatever kinds of objects we wish into the options. Now for the deploy task itself:

# <== include("started/newway/pavement.py", "deploy")==>
@task
@cmdopts([
    ('username=', 'u', 'Username to use when logging in to the servers')
])
def deploy(options):
    """Deploy the HTML to the server."""
    for host in options.hosts:
        sh("rsync -avz -e ssh %s/ %s@%s:%s/" % (options.htmldir,
            options.username, host, options.hostpath))
# <==end==>

You’ll notice the new “cmdopts” decorator. Let’s say that you have sensitive information like a password that you don’t want to include in your pavement. You can easily make it a command line option for that task using cmdopts. options.deploy.username will be set to whatever the user enters on the command line.

It’s also worth noting that when looking up options, Paver gives priority to options in a section with the same name as the task. So, options.username will prefer options.deploy.username even if there is a username in another section.

Our deploy task uses a simple for loop to run an rsync command for each host. Let’s do a dry run providing a username to see what the commands will be:

# <== sh("cd docs/samples/started/newway; paver -n deploy -u kevin")==>
---> pavement.deploy
rsync -avz -e ssh newway/docs/ kevin@host1.hostymost.com:sites/newway/
rsync -avz -e ssh newway/docs/ kevin@host2.hostymost.com:sites/newway/
# <==end==>

Where to go from here

The first thing to do is to just get started using Paver. As you’ve seen above, it’s easy to get Paver into your workflow, even with existing projects.

Use the paver help command.

If you really want more detail now, you’ll want to read more about pavement files and the Paver Standard Library.

Paver-1.2.1/paver/docs/_images/0000755000175000017500000000000012152711214016413 5ustar almadalmad00000000000000Paver-1.2.1/paver/docs/_images/paver_banner.jpg0000644000175000017500000006520212152711177021574 0ustar almadalmad00000000000000JFIF@ExifMM*iߠC     C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((((($M$ƿyƩCiw~Ec<܎ufszV%4;?5k([`fMaaJPKeBvm^sw?ðo[ep>]VX\Ż:D <ňο2pL[3 GC3* WԾ9ު]|J-%EE5ku1 5X?ŵjJ' WW>ѢG1j=ķY6<{O0)#+(b;+뎣5Wq]E,ۧ;N5uM \yQ ( (PyeS@= -Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@յ2H@I>!xA!y[dFUdY3 "zb䔥蛻ƅIAEvPAVNXh:9j8HހU'QB);$VةRIA]C=k!p5ŋlK<0,ܖ?*_|ѯ|t5#.ByDó\9XS9am7q҇!K&5.JkRWm}1B7܏5?ܖKH }?,לk5O,_`Ѭ<>Q]U+|EYRh> =zG$>$nI6z]W:eZ'\Ds5qx`_9_#\JQ\ҧ9=5<>NVK}T7L#Τ˛G׵=7YN6݈&^XmlwBʏr@ Gj]zI#i}7ԑIIt8%vUd)?l7IxRR^gTcnkyE%4#~az^ȇ͞BXǍwb]a_0X֟=(cN^q}") ;COx5/ROiW/~Ikt-'L3VlW^8cml5cIT5KEׇ>|?ǏZZt oyB!O5قaC+Iʵgʮݒ'%vdClf+ɨ魒ZoauC/ßdDE:#\s_xbB#=XKC4u[Ry#3gidr9y6}Q /u܍_Wl?ězS5;r ՛{WM׊VՏŨp36ĺg-yR֧^=ɥi\7i.h?Ey0_XZ44 7̍$9?|w{s-ui~k/'l$z4Y^Οt& u4^tM+ٽ'޿$]lտoi^ҏr A'*I?iyLSSƴ@>?tV9?b3e}]zsb+֨UO>Q2^Kþ;AՎc~B 3GeЯ^}6R=Dw ,j9^ IqE =ౘԥZ/jFI)+VC<Z _dN?Vu}J-3SItZN#.cq}:W杮>׾<%xϽ\ y5l]u<eaeae|%R\~>>nG5^RJ5R%~ky7ժ<6 yc[52 "M/L./곶^ zy |G?XC)Gz>,x+9Od4_uՙ;[ YҪдQE}!QEQEQEQEQEQEQEQEQEQEQEQETr1&8ug`hhMK (h෍w< **T"'dmm[]81|+μmANzWIhFu5HH2_N>=%?m.v5d)Ho/Ok^gX /ŲQuʩj,A-+*OpO;;wjyoo{ӏ3tIhKC찘 xzQ/0d?u@?ATgHGg`ƣbp}Mw _E&-F-- P~Ÿ$ x}jaJbm_һ<9Q :\!=V^֝μmԏn~m*aP[3TU#o']_ Q_>"ߪ,AJ+cu.HI=gZ.w}-dߕq^&wrhh |%ڬ_c--ɋ`1RIgvrhςnu>3{xBV2Hҗ>DјeY"> :޷[0.,V%Jb2N9+-FlGѡQlyӁbD3_A'?0sfx̕ kk^E+jg LdjJ/-ihyq4 ?=vچ%d h79''ֱ"! K)vI<BMZ1V_l(o.ȿyG>x_VO5l-'$苞3Oǭe^PMnXԝJ$dez~:EgwN#SvnX!<)myt +8"i'yLB4Qf|I*qJ/59-וާ>-Ez>e'sV5;i]Jd[]&V^L<'GaJ5"O_2Uo 4!KYl=A|sG3Ҍ]ѴJhzWD8!xGXyuk!d~e<ԁ-Wן!~:kvu%v ~jk1H|M⻭BYS;wsd9^ѻ2pkc諏O5ͰԷE&k Dyz6[QEjQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@PI'^o^[u;pXD__5ƍ/i:{kEnf{v)Sr@8i~7OqHgV6zvT+ ڶySQ|H|s<_0GR^yM&黌mtӯpl'+g]?DfCacQ9ObK.^O2vt5̘DAzH2M6}n[iuˋki]G9*OQ$x*l2+}|՘ĜbQwƕa0tv{=nHp/Y{{GwzmJ+[iH%#}dL:qd#fbxrMQOr+[ÚO$tA?ҵC ܪ7WTr [%{ (Dߛ=fWɮ\ЋjJ턴Y;3t9>~ΗNj̒k*';s4P*:T$~=ڔ$#RBH|D)8#by }L|`])]e[+ݡffcVaSiW4F/)w\zFgT2jv~~Ke}jqMkj|i0nY*Nm+od;|GgьIV+ YF&/4eB ir%ϩzӭ K{ b(Wm#v=٘'$j!>3{⡸kД(l= zQc+ʞ 5=e۫OW.Y?z{yG߿iy稬ԛw#@xYҴ[wGBQo_|`4G6k~(& mgIg}$WXFtn,Xɸ+RlZCȰ%)>Y]8J6j"eWG\|e5ZpkʄPG/X~|=@H7k&԰6LΥ#>PU6zWhZE׈Wo[3F繙@=5|L^&g-VizH+Y^8=(9Se7vI{-Z>C ۔}ߞSC⛻)oj7>#6 #.m=}b_RSx΍Õ- M띻9;-v!|Wsm-*gv\0# a ͌E C G (0ơUG)kӆ1U{m{[\8 IkE|_3I8q'+Od}/R_*#DAv'@'\ Q46آK<kش-J/xx#IǫbMNkR,=U}kN0ϞgrNWZ(x>L(((((((((hdyQw;QM)IE6ݒW$g_f]M[FrZ|M94T'_[]Yxnkyk88>P7/אDc: f Yi*Pmnm8sXz?^~0[k;-%vDEWɾ!4YzdoGVԸۂ;.iyrKOjWwzƷ:P} z"_lV|M*c+2NhlXUܼ#rI>bIIepv'5OZz"X mߵXy3SަTTz+Sʥ-Gj: b}cXp}tV+X];m={'/w> Gcj ^f9FsVbO>Cp}|6p`}|2Z}Le=>4m;zd NA<݁ ?*xu)Lfs6xЎYi? q*ZO#ok|`_3H9W#w{Fެ3Yg[@O a<}IOsSuqOኲ?Wg.OV6̀Iz/ywVr!B i^x:_s-nHr?*=koNOˍZ"Xl8kOOMZ4tQ}G9C W%yahZY"s B 3,6P[Ɛ5 `Vzyq{yjX_N (EG|/˲`uwӢlN5o|3C̭~(ZMxU_\ŜqSP=̂+h#w'c&OzU~!\IU;xc{*fSVK>"Ww.ND2yN֓Weע3~#:7GY_MnmQE[bi ݮ% .5cDo~x?M6A$pkABD`;aʒ;?x JĚx~nNW|=p+xT^wHwklC K7nfN, .zx7z?8bܭ;UU\/vZVDQSߥgJC'ҲW?/@H3TTRI~񎭱om'rcFyEy$֡ohjtTł*:Yn"} ?K ?Pl ~7!m[Hd1Կ<5 |qěźc7>JuQ]U㟍v"hw^𶀍?|AI|($ .NP3m!5IuIzq\:pKs|dnŶbiԮaq dm__猾+xKdM,/me-onä - 9 ~:UfhqJw]jιH$^q_ pUIqKH:mi;ϜAO/߫l4l% qڬE~|QEQEQEQEQEQEQH 1 dxj>7֚ΒQ*L35β׍(wW6Z\β򋟋dSW<1?M]ڥL$?e'܁_!cqҔމs_e};p[z*eipPZJ' rB<6M+q"vckϊ,t{WUÖ(г9;QU/#=}Sq̡ xBSW?a _[IZS:F.~Yn<L_A<= ^Sooq9]|p&qnF~cq _}'_7 h+kǩjO^ msT1H[M#6o Ads6c]IHzkoGm½UZxj2WH]]Kz/_3Ѿi||LeZmvO4\|ih p:wuxTϢ_㷉݇`ۨksϕ Y&ŌI5-CWu?jd@8W*{OsN^+-4ov'?>HNz.i7j稫SsĚ曠7wK)c˹@<:W\+mW]})`U1WOxO!1.Ȓ쐀pc5ڟj xf5 >R)\_71S)YG Ӵӓ}k}5?3L9CN3IVV蹥ee|"[:OMAUO_B/=zT)LJOK {(2Ȭpy__xڌZvOx{V(l>{wf)9⾢4=?  q}.6n뫆2{kW|R< qwTӌ)retoioOK?yi%k=wƟ]ᕯ|׷𵾌/ԑ r@O S:_j:ꫳVn ϔX#ɞ[ݮ[sAaoWH>T3о;W׋=K9+9[`},Qg^pp_om叟K{tw6.4cVs ~);%?Y8P*Uߢ4F|^bTLq_jv'?);$I+(lqfϢْ{E+p c_k5ׅ|sxni[LRg*+WY G-x^38OquhTݻ}RZQC(U TYo)abQj~>b8w[E_2o#tzEf#L?|zW];'<7cC bc4=D1LExO]2-a7-0Zj) )RAdžR/6s $Xp7ʘF=p_JRz]E&z}k5|u)M7~3;t? 3 f1,bPvYcV}{~/xRk(-[FOsS__-}Ő$,+/|Jѵ/^iZ|~]}D_ïˇeajJNxڎthV&Sݟn8TsFz>:xto ݹt2곣I )G"CgeH*"T`:US]5iVVv?j?6$-ܤw3%Yyv_/֔*f dzV{]n⠣I`3W!#HP]9Yi`7';a_Bz:"M[Ǖ:#ՙ<%ş&y;KEqǹq)QںG4ن:ey$xXPc#)U`渿0z=^It$nJ0Ǟף[ ҕ6ںj}t}=|,OJ\Z7u4:MOZu?hbea'?g Eup=;3ޮ4#Y-԰xP#Eݮ X1aܞھf7GDž#VFM2ܸD>lz^OGi{Zh)cbGϹ$P?ǩ~̾@jߴ/-f 0"V63 5x}Ox890N)}=o#>7QoB_ Y|^~$sϟ-ωAS[rHǩ9,Tywdu|7[6!3}ƶ6ꚅϕ Qǩ>ֿ.uKk:`jz\\x<,c*eC'\Q3/zpΧےj_EZtV,yhgg|ײ?0`=3TO3ޟE=y3޺xj_F!fiNhAg1GԞƱN RQ1Wl1TpXyתg孎{_xOpB0(&[O@@ z5k|5ψ,W._ۼZ7#kYhH~oo,o7%h0F_x{ml&cҐ /i,O*5e6@EE\ʬWbr*\qu^$Uҡkw'}^JOeo<YK$V7-2;lQq&k>x\#iqhv3lz/b+>KE|Ww$j3!3nl[YNmh{mVMܸ"0өȭ뷞޺9ʨYUI8?Xh^>$egY $6qMbzisK6U8"}bCSZo~O!u+ajn-`AV*$׷omzX.*5$1Pݴލdu?(X ѲMlWf?7esErK,pZF%F݀3U)jb#(~ޗ:zZ{\$ཚ8m$ַ/ۯ:F<[L#>7Xa쑧xX?Z}>&b:%f9Rp7s_pØn#)C8r_'tbN5nM_@+9Š(((()O#TPK1IWUއ[mJ"!~_?7'[Ѵ\hmWg T`[$|R:GsĒlWo"gwvi9idbYݏ1$k*yz)Bޣ]oitiSG>+.<}h7}\DM3ޚEid\ʰZG`lj:!h-:iceڄ1_cC M/'/kb:i_=C|%oCA.. wܱ{ӭ'*\L6vuUQIok|.ω-i%őr;UQ $6ޥQg߹5Y%rz+.]Sx>QJQ;_%؟M6τ?fh1FXiGC1]~=E6ke(61{O_7 u[?k_qlՆ~otED 鞦ߋ0.o. DK379#Oz)C *N]jjVi>^R}Kg_'3K.n&2L>oM7T|CS:+<{"_=HfKhDNpBI\~2L`0PZտ><C(`+f|hyZ/W|G4qqc24+ُv>qOa9=M6t߉O%ΠOwv%m,UʽKA9p6njRfL{D$1_{n/ $gK7V|B>K3^POҾ|+z7 %6_hg;)5qYVwP7K%~+~=ᆴ}=}E~'? <j'S[Kb}5 zm%^i|2`t*6I ~T:>>gVV4ˏxzzy9'{ `F"(~Ekg⤵䏹O~/=74$3n_q_|'D'Mc'gkoU(2f$UE¨^ʠWؼYIo?PF=fS<'Ԙ8~aӢc}Ŵk59wpJj-]׿nƇH]_C4h8jMOeg9g+Sv$((8w8w!n '1\9|O?ƨ! [D#PJ+(((((9f8i>.~&$+=þ%Y鰓RvD'`O$?*d|1,.b߲{K$~IULلW-uw|WOoc] m_ԣm<=}UiYYy.'{g$3w>?#&w`,}+U<V}_ݟ pʲx~^O^HgǞ/Hњxe&;dbB9wb 1В@Ot}Tӿ"I J:'|$%ms{ X_jXg۟:M2t$Sfq ǜ,0dt@FGUF'˟s<2swqf㦋kWӫ??^7ݢud|$bi$r,ܳ{ 6XR}x_YyOom?O%=2~F_SN4F)$pXaF*}[Ֆ& 5e=΢(fVv q]ww2/0{o7޽/7:ONҎG׷g!1_ kenJm|4خ[ģ7B{ïQ'1¾77t+u`DRS#x̉\K;s^/ُ>>t_+ mL yfސ`+m/4M,aPoE}+7/qx,Ǝu5J(}[R]-IVL;o1I-ɾ̺oNcmGjo~%߂4MSOm5V]HS.~dH$d gx yx^y릴`z,?_KoYTb2D!SKn_yYKޏ.V}յ8K)e9EVzzX.+.Ms ^^k?xJˆ[7{B\|9,|)uX=[M񖴇w=2½O4&->T ~U7wZ=:Y犙a+7&ܶGúW¿6x{^'}l+ռ3(4ҵ8u_]!kVP++v)e(R̕f'gcs\^-޵F/c7N"-:T ~UEGQEQEQEQEQEQEQEQEQEQEQEQEQEq;Nnq W%{}#O_j[XvVH]^C ~իW!v G"R{?sqS=|OǵEކ{(vuN݋?>Ԏ߫ wQ]Cf~šYV v;C~{Z%bdO18RYr$ΥVN׵n\-b(a)]Owkmzc|GEu*Nd'|al7=KeWidi%سHrI$ORk8^~8oQxx{W%dny/8TW4{/%w4|}'ᄚi[ĎM=x 4# +{׏/!qc_U !V>@&cx!a7\.[\\'ઐW1ձ[UN[>ֿIo~_|PO-kx/}zUcெud,8i'lq/19+>VյCW'F}pR 0vU{gï|M| ^m58yϘ=k_8s9*/UExM¯ yX>(񞦓CMivQTO@M~.RvH3 o uxO5??Fí\/^A?kDozCg $1|#;]$pyX,ԡB\ bz+o]LYfX/(5/mlΤPF{>'$m ڝG`P~4C}+ Pͤ|?>qT^^0`8Zѓ>1lDm,zt1~tUaھt|5>#F~ʬR3yjWR_b +/Is_#K c2F/Du36hm]/PQ'6IS_qRL~6zַǺn^jڝJZۀdM†H.O^vGcğo?:M%.BZ3do԰ȿl1ͱ15mv^gq.[5JyvOs|Avxz 9eƭuFL+־߁ZMkLvK-wq',%}7G7%'xn-<6zÁؐ}Ec5J|Ksu߈V6\ڀ;*a_pM75?5n=|@Ti?wW½^|dϬ /M$OϫE}'>xN-' >y1J{7RI^UB8}\ a2:R}'ӥqʜwz.EWAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYΣ{FLbN+N⮯:,G-+y2~y?|'_ff߽s\|c)޾|8W0ٖMD; cn3_ 4xxׯ`K0l HKa=j#ܞx,I_4? qe 98U}hy}_SXSxkρ_A,n&&8d=#yO@.{mAߴ7>#Ծ|/mq?OAd9v{bNI5Cf #HbNa8OWI | .𭕽-4[l`pM}m ;k.ׁx{ gѬg2h~-mn`p9rz4-W7Tov2~I+E͢Y75k|VvI1id<īÎ'_]|uK7cOy"}#3oL,;ڪnşx+’3pkIG^܏D=O;8T^¿љlZGlkb*0NO++qr*jѧ_7d̲6^ + ![YIy񳎪?^ӥO~ E.c{Xy */c| dwk.YXܟ,Trq_^4 h:E*#(]6G=:ҕ)ӡv6M֮y4 fBNi.c>`e-[Xܠ[=<v[>TAܓ}tOҝ *fn/ G9?_S5RvJ*F)-c#M'|BS |7c.vb#cW!pB;>+|I#K;Y{y'޽WЬ VP{;pן+଻Y|F*N_{Tۥ pdr8FҪ=M{GOњ``5+*(ޓ |;k-tt˭gWdAE ?NJ/ٻx'[Z%g0&ȩ8bĀp x: ZфnNײuk2*uWKM_]ntf>6GO 7 q:ڔɘ?b=.{$jI :qýO*E?^ɬjef/' WK}14 afm&:'_qDž<=C9H4ݕ¬?Ό;px5YOJ#MOQ?d }eciiYkk(**ud  JF*}[սY#VGRVQEz!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEuH܅E=&W`xoōX6gfГ?oyz1D=EVj6~!zs:ٺqVnv0QU@U¿f@_Q~? =Ll){_3Kd cDԱNi[<ɜBC_..!Ed |~H'Kោ~OofeeS9pk(WS#?c*FMs?E}_3i;_+['Lj}VxOԟjBAbxa$Yͩ8h_gŷȚNھ]ݵZ@&B\__O ^[f$ӟ fx?< X;mBuC~ |$:O4AOݛ}d"t:Wh 6^M|!LL_TOIn8V0?56 x7em;:;wi<.ZRCv3ͭ|.UsIimNm;=pE15M[?:Pİ3K#Mv2N[l{W x _<#Ycn K l#ß :>}1ɨt}g?ūx)ՉA%G|/L!W/:u֯_5֯ݶgs۹'5|cq>whn\Kd>(ϊwehߕEl{{_=Q_FF"cxQy;Sdw"S׳\ BJԸT>c Iž4x`-EtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEDUk"ʺ H2'i^U]OPFE|W&]DsjIQ٫ٿS: =ת?2l[}|2{n=q4{k)EwO|k Paver: Easy Scripting for Software Projects — Paver 1.2.1 documentation

Paver: Easy Scripting for Software Projects

_images/paver_banner.jpg

Japanese translation available thanks to Tetsuya Morimoto. Latest stable documentation is on PyPI, latest development docs are on github pages

Paver is a Python-based software project scripting tool along the lines of Make or Rake. It is not designed to handle the dependency tracking requirements of, for example, a C program. It is designed to help out with all of your other repetitive tasks (run documentation generators, moving files around, downloading things), all with the convenience of Python’s syntax and massive library of code.

If you’re developing applications in Python, you get even more... Most public Python projects use distutils or setuptools to create source tarballs for distribution. (Private projects can take advantage of this, too!) Have you ever wanted to generate the docs before building the source distribution? With Paver, you can, trivially. Here’s a complete pavement.py:

from paver.easy import *
from paver.setuputils import setup

setup(
    name="MyCoolProject",
    packages=['mycool'],
    version="1.0",
    url="http://www.blueskyonmars.com/",
    author="Kevin Dangoor",
    author_email="dangoor@gmail.com"
)

@task
@needs(['html', "distutils.command.sdist"])
def sdist():
    """Generate docs and source distribution."""
    pass

With that pavement file, you can just run paver sdist, and your docs will be rebuilt automatically before creating the source distribution. It’s also easy to move the generated docs into some other directory (and, of course, you can tell Paver where your docs are stored, if they’re not in the default location.)

Features

  • Build files are just Python
  • One file with one syntax, pavement.py, knows how to manage your project
  • File operations are unbelievably easy, thanks to the built-in version of Jason Orendorff’s path.py.
  • Need to do something that takes 5 lines of code? It’ll only take 5 lines of code..
  • Completely encompasses distutils and setuptools so that you can customize behavior as you need to.
  • Wraps Sphinx for generating documentation, and adds utilities that make it easier to incorporate fully tested sample code.
  • Wraps Subversion for working with code that is checked out.
  • Wraps virtualenv to allow you to trivially create a bootstrap script that gets a virtual environment up and running. This is a great way to install packages into a contained environment.
  • Can use all of these other libraries, but requires none of them
  • Easily transition from setup.py without making your users learn about or even install Paver! (See the Getting Started Guide for an example).

See how it works! Check out the Getting Started Guide.

Paver was created by Kevin Dangoor of SitePen.

Status

Paver has been in use in production settings since mid-2008, and significant attention is paid to backwards compatibility since the release of 1.0.

See the changelog for more information about recent improvements.

Installation

The easiest way to get Paver is if you have pip or distutils_ installed.

pip install Paver

or

easy_install Paver

Without setuptools, it’s still pretty easy. Download the Paver .tgz file from Paver’s Cheeseshop page, untar it and run:

python setup.py install

Help and Development

You can get help from the mailing list.

If you’d like to help out with Paver, you can check the code out from github:

git clone https://github.com/paver/paver.git

Ideally, create a fork, fix an issue from Paver’s list of issues (or create an issue Yourself) and send a pull request.

Your help is appreciated!

Running test suite

Paver contains both unit and integration test suite. Unittests are run by either paver test or paver unit. Integration tests can be run by paver integrate.

Using older, system-wide installed paver to run tests on development version can lead to bad interactions (see issue 33). Please, run paver test suite using development version itself, by:

  • Creating virtual environment with –no-site-packages

and

  • Installing development version with python setup.py develop

or

  • Using embedded minilib, thus invoking commands with setup.py instead of paver

License

Paver is licensed under a BSD license. See the LICENSE.txt file in the distribution.

Contents

Indices and tables

Table Of Contents

Next topic

Foreword: Why Paver?

This Page

Paver-1.2.1/paver/docs/bzr.html0000644000175000017500000001111712152711213016472 0ustar almadalmad00000000000000 Using with Bazaar-NG (bzr) (paver.bzr) — Paver 1.2.1 documentation

Using with Bazaar-NG (bzr) (paver.bzr)

Previous topic

Using with Subversion (paver.svn)

Next topic

SSH Remote Access Support (paver.ssh)

This Page

Paver-1.2.1/paver/docs/misctasks.html0000644000175000017500000001546412152711213017707 0ustar almadalmad00000000000000 Miscellaneous Tasks (paver.misctasks) — Paver 1.2.1 documentation

Miscellaneous Tasks (paver.misctasks)

These are some other tasks that are located in the paver.misctasks module.

Miscellaneous tasks that don’t fit into one of the other groupings.

paver.misctasks.generate_setup(options)

Generates a setup.py file that uses paver behind the scenes. This setup.py file will look in the directory that the user is running it in for a paver-minilib.zip and will add that to sys.path if available. Otherwise, it will just assume that paver is available.

paver.misctasks.minilib(options)

Create a Paver mini library that contains enough for a simple pavement.py to be installed using a generated setup.py. This is a good temporary measure until more people have deployed paver. The output file is ‘paver-minilib.zip’ in the current directory.

Options:

versioned_name
if set to True, paver version will be added into minilib’s filename (ie paver-minilib-1.1.0.zip) purpose is to avoid import error while using different versions of minilib with easy_install (default False)
extra_files
list of other paver modules to include (don’t include the .py extension). By default, the following modules are included: defaults, path, release, setuputils, misctasks, options, tasks, easy
paver.misctasks.paverdocs()

Open your web browser and display Paver’s documentation.

Previous topic

Documentation Tools (paver.doctools)

Next topic

Virtualenv Support (paver.virtual)

This Page

Paver-1.2.1/paver/docs/py-modindex.html0000644000175000017500000001144012152711213020131 0ustar almadalmad00000000000000 Python Module Index — Paver 1.2.1 documentation

Python Module Index

p
 
p
paver
    paver.doctools
    paver.misctasks
    paver.path
    paver.setuputils
    paver.ssh
    paver.svn
    paver.virtual
Paver-1.2.1/paver/docs/pavement.html0000644000175000017500000006426312152711213017526 0ustar almadalmad00000000000000 pavement.py in depth — Paver 1.2.1 documentation

pavement.py in depth

Paver is meant to be a hybrid declarative/imperative system for getting stuff done. You declare things via the options in pavement.py. And, in fact, many projects can get away with nothing but options in pavement.py. Consider, for example, an early version of Paver’s own pavement file:

from paver.easy import *
import paver.doctools

options(
    setup=dict(
    name='paver',
    version="0.3",
    description='Python build tool',
    author='Kevin Dangoor',
    author_email='dangoor+paver@gmail.com',
    #url='',
    packages=['paver'],
    package_data=setuputils.find_package_data("paver", package="paver",
                                            only_in_packages=False),
    install_requires=[],
    test_suite='nose.collector',
    zip_safe=False,
    entry_points="""
    [console_scripts]
    paver = paver.command:main
    """,
    ),

    sphinx=Bunch(
        builddir="build",
        sourcedir="source"
    )

)

@task
@needs('paver.doctools.html')
def html():
    """Build Paver's documentation and install it into paver/docs"""
    builtdocs = path("docs") / options.sphinx.builddir / "html"
    destdir = path("paver") / "docs"
    destdir.rmtree()
    builtdocs.move(destdir)

This file has both declarative and imperative aspects. The options define enough information for distutils, setuptools and Sphinx to do their respective jobs. This would function just fine without requiring you to define any tasks.

However, for Paver’s ‘paverdoc’ built-in task to work, we need Sphinx’s generated HTML to end up inside of Paver’s package tree. So, we override the html task to move the generated files.

Defining Tasks

Tasks are just simple functions. You designate a function as being a task by using the @task decorator.

You can also specify that a task depends on another task running first with the @needs decorator. A given task will only run once as a dependency for other tasks.

Manually Calling Tasks

Sometimes, you need to do something before running another task, so the @needs decorator doesn’t quite do the job.

Of course, tasks are just Python functions. So, you can just call the other task like a function!

How Task Names Work

Tasks have both a long name and a short name. The short name is just the name of the function. The long name is the fully qualified Python name for the function object.

For example, the Sphinx support includes a task function called “html”. That task’s long name is “paver.doctools.html”.

If you `import paver.doctools` in your pavement.py, you’ll be able to use either name to refer to that task.

Tasks that you define in your pavement are always available by their short names. Tasks defined elsewhere are available by their short names unless there is a conflict where two tasks are trying to use the same short name.

Tasks are always available unambiguously via their long names.

Task Parameters

Tasks don’t have to take any parameters. However, Paver allows you to work in a fairly clean, globals-free manner(*). Generally speaking, the easiest way to work with paver is to just do from paver.easy import *, but if you don’t like having so much in your namespace, you can have any attribute from tasks.environment sent into your function. For example:

@task
def my_task(options, info):
    # this task will get the options and the "info" logging function
    # sent in
    pass

(*): well, there is one global: tasks.environment.

Command Line Arguments

Tasks can specify that they accept command line arguments, via three other decorators. The @consume_args decorator tells Paver that all command line arguments following this task’s name should be passed to the task. If you’d like specifying a number of consumed arguments, let use @consume_nargs. This later is similar by default to the previous, but alos accept as an int argument the number of command line arguments the decorated task will consume. You can either look up the arguments in options.args, or just specify args as a parameter to your function. For example, Paver’s “help” task is declared like this:

@task
@consume_args
def help(args, help_function):
    pass

@task
@consume_nargs(3)
def mytask(args):
    pass

The “args” parameter is just an attribute on tasks.environment (as is help_function), so it is passed in using the same rules described in the previous section.

New in version 1.1.0: @consume_nargs decorator superseeds @consume_args, and optionally accepts an int as argument: the number of command line argument the decorated task will consume.

More generally, you’re not trying to consume all of the remainder of the command line but to just accept certain specific arguments. That’s what the cmdopts decorator is for:

@task
@cmdopts([
    ('username=', 'u', 'Username to use when logging in to the servers')
])
def deploy(options):
    pass

@cmdopts takes a list of tuples, each with long option name, short option name and help text. If there’s an “=” after the long option name, that means that the option takes a parameter. Otherwise, the option is assumed to be boolean. The command line options set in this manner are all added to the options under a namespace matching the name of the task. In the case above, options.deploy.username would be set if the user ran paver deploy -u my-user-name. Note that an equivalent command line would be paver deploy.username=my-user-name deploy

For fine-tuning, you may add optparse.Option instances:

@tasks.task
@tasks.cmdopts([
    make_option("-f", "--foo", help="foo")
])
def foo_instead_of_spam_and_eggs(options):
    pass

You may share @cmdopts between tasks. To do that and to avoid confusion, You have to add share_with argument:

@task
@cmdopts([
    ('username=', 'u', 'Username to use when logging in to the servers')
])
def deploy_to_linux(options):
    pass


@task
@needs(['deploy_to_linux'])
@cmdopts([
    ('username=', 'u', 'Username to use when logging in to the servers')
], share_with=['deploy_to_linux'])
def deploy(options):
    pass

For sharing, following must be fullfilled:

  • Both long and short option names must be same
  • share_with argument must be specified on top-level task

Otherwise, PavementError is raised.

Hiding tasks

Some tasks may only exist as a shared dependency between other tasks and may not make sense to be called directly.

There is no way to provide that, however you can hide them from paver help to reduce noise. Just decorate function with @no_help decorator:

@task
@no_help
def hidden_dependency():
    pass

Of course, this should not be used usually. If task is not to be called at all, why not just make them a g’old function?

More complex dependencies

@needs might not cover all your needs. For example, depending on argument or environment, you might decide to call an appropriate task in the middle of another one.

There are two key options for fixing that:

  1. @might_call decorator, which indicates that task might invoke call_task on one or more of the specified tasks. This allows you to provide command line options to task that might be called (it is inserted in dependency chain):

    @task
    @cmdopts([
        ('username=', 'u', 'Whom to greet')
    ], share_with=['deploy_to_linux'])
    def say_hello(options):
        if not hasattr(options, "username"):
            print 'SPAM'
        else:
            print 'Hello, my dear user %s' % options.username
    
    
    @task
    @might_call('say_hello')
    def greet_user(options):
        setup_environment()
    
        call_task('say_hello')
    
        do_cleanup()
    
  2. Providing options and arguments to another tasks directly. Options are provided with final assigned value:

    @task
    @cmdopts([
        ('long-username=', 'u', 'Whom to greet')
    ], share_with=['deploy_to_linux'])
    def say_hello(options):
        if not hasattr(options, "username"):
            print 'SPAM'
        else:
            print 'Hello, my dear user %s' % options.long_username
    
    
    @task
    def greet_user(options):
        call_task('say_hello', options={
            'long_username' : 'Kitty'
        })
    

Console arguments (args) should be passed as in console:

@task
@consume_args
def say_hello(args):
    print 'Hello to ALL the users: %s' % ', '.join(args)


@task
def greet_user(options):
    call_task('say_hello', args = [
        'Arthur Pewtey',
        'The Reverend Arthur Belling',
    ])
Paver-1.2.1/paver/docs/objects.inv0000644000175000017500000000200512152711214017153 0ustar almadalmad00000000000000# Sphinx inventory version 2 # Project: Paver # Version: 1.2 # The remainder of this file is compressed using zlib. xڕVMs8 Wpi}f{-mv촻uګ5Ep$Q6)Vo ;uzX)];|oԫ_-_SgϤ1ԕxNqDxS)1f|`aG4LW3pW2[Xf^Zf L }H1ȷ&r< ~rY/4శcO 0]enz.vO掴kie^N.c7 S;jv5;Hcg{Hڭ/4vOD{%G# D$S.[#~GV` Ph'Zo6r-QGo ߀p+*t8%թF6wx+¹\"؜iXy.I=hvrXw )hJ< ^И*E87ы:ի fyNDgڲۤeSO0Tb̮D߂*߄aOBќMh&OZ#joH4Hפ22v5Bo }C$|hg1\%^#N3\Z:-0UI~a(e<ZixPf> s9|<3qn㞹}a^)S\J.OTZ=4APx-k3oldG w;7sά  ^\0O8m)psY[4\ ˂|>0;^]ikڊyq%>0;_F g3&-?\Qg`f\K?৤9/ݓjΒH E̢ _b;W"mpu!f{9>!eFش;[\mb g XtPaver-1.2.1/paver/docs/credits.html0000644000175000017500000001154012152711213017332 0ustar almadalmad00000000000000 Credits — Paver 1.2.1 documentation

Credits

  • Kevin Dangoor is the original author, designer and coder.
  • The Paver project has gotten patches from Juergen Hermann, Marc Sibson, Greg Thornton, Michael Greene, Krys Wilken, Bryan Forbes and Ryan Wilcox.
  • Ned Batchelder’s “cog” package is included for handling inclusion of files into the docs.
  • Ian Bicking provided a lot of great input prior to Paver’s initial release pointers to code that he’s been using both at Open Planning and prior to working there.
  • Ian is also the original author of the paver.setuputils.find_package_data function.
  • Jason Orendorff wrote the original path.py module that paver.path is based upon.
  • Michael Foord’s Mock module is included to assist in testing.
  • Ian Bicking, Jim Fulton, Philip Eby and Georg Brandl lead the various projects that the Paver Standard Library takes advantage of. Without those projects, Paver users would have to do a lot more work.
  • Though it seems almost too obvious for a Python project, Guido van Rossum deserves credit for making and steering a language that is so flexible and clean for such a wide variety of tasks.

Previous topic

Paver Changelog

This Page

Paver-1.2.1/paver/docs/virtualenv.html0000644000175000017500000002143512152711213020100 0ustar almadalmad00000000000000 Virtualenv Support (paver.virtual) — Paver 1.2.1 documentation

Virtualenv Support (paver.virtual)

Paver makes it easy to set up virtualenv environments for development and deployment. Virtualenv gives you a place to install Python packages and keep them separate from your main system’s Python installation.

Using virtualenv with tasks

You may specify which virtual environment should particular task use. Do this with @virtualenv decorator:

from paver.easy import task
from paver.virtual import virtualenv

@task
@virtualenv(dir="virtualenv")
def t1():
    import some_module_existing_only_in_virtualenv

paver.virtual Tasks

Tasks for managing virtualenv environments.

paver.virtual.bootstrap()

Creates a virtualenv bootstrap script. The script will create a bootstrap script that populates a virtualenv in the current directory. The environment will have paver, the packages of your choosing and will run the paver command of your choice.

This task looks in the virtualenv options for:

script_name
name of the generated script
packages_to_install
packages to install with pip/easy_install. The version of paver that you are using is included automatically. This should be a list of strings.
paver_command_line
run this paver command line after installation (just the command line arguments, not the paver command itself).
dest_dir
the destination directory for the virtual environment (defaults to ‘.’)
no_site_packages
don’t give access to the global site-packages dir to the virtual environment (default; deprecated)
system_site_packages
give access to the global site-packages dir to the virtual environment
unzip_setuptools
unzip Setuptools when installing it (defaults to False)
distribute
use Distribute instead of Setuptools. Set environment variable VIRTUALENV_DISTRIBUTE to make it the default.
index_url
base URL of Python Package Index
no_index
ignore package index (only looking at find_links URL(s) instead)
find_links
additional URL(s) to search for packages. This should be a list of strings.
prefer_easy_install
prefer easy_install to pip for package installation if both are installed (defaults to False)
paver.virtual.virtualenv(dir)

Run decorated task in specified virtual environment.

Table Of Contents

Previous topic

Miscellaneous Tasks (paver.misctasks)

Next topic

Using with Subversion (paver.svn)

This Page

Paver-1.2.1/paver/docs/cmdline.html0000644000175000017500000001532012152711213017310 0ustar almadalmad00000000000000 Paver Command Line — Paver 1.2.1 documentation

Paver Command Line

Paver does sophisticated command line parsing globally and for each task:

paver [-q] [-n] [-v] [-f pavement] [-h] [option.name=key] [taskname] [taskoptions] [taskname...]

The command line options are:

-q quiet... don’t display much info (info and debug messages are not shown)
-n dry run... don’t actually run destructive commands
-v verbose... display debug level output
-h display the command line options and list of available tasks. Note that -h can be provided for any task to display the command line options and detailed help for that task.
-f <pavement> use a different file than “pavement.py”

If you run paver without a task, it will only run the “auto” task, if there is one. Otherwise, Paver will do nothing.

paver help is the equivalent of paver -h, and paver help taskname is the equivalent of paver taskname -h.

You can set build options via the command line by providing optionname=value. The option names can be in dotted notation, so foo.bar.baz=something will set options[‘foo’][‘bar’][‘baz’] = ‘something’ in the options. If you need to enter a value with multiple words, put quotes around the part with the space.

Important and useful: Options are set at the point in which they appear in the command line. That means that you can set an option before one task and then set it to another value for the next task.

Previous topic

SSH Remote Access Support (paver.ssh)

Next topic

Tips and Tricks

This Page

Paver-1.2.1/paver/docs/tips.html0000644000175000017500000001224412152711213016656 0ustar almadalmad00000000000000 Tips and Tricks — Paver 1.2.1 documentation

Tips and Tricks

Using a Config File For Settings

Many people like to have their configuration metadata available in a data file, rather than a Python program. This is easy to do with Paver:

from paver.easy import *

@task
def auto():
    config_data = (read config data using config parser of choice)
    # assuming config_data is a dictionary
    options.update(config_data)

The auto task is automatically run when the pavement is launched. You can use Python’s standard ConfigParser module, if you’d like to store the information in an .ini file.

Table Of Contents

Previous topic

Paver Command Line

Next topic

Articles about Paver

This Page

Paver-1.2.1/paver/docs/_static/0000755000175000017500000000000012152711214016435 5ustar almadalmad00000000000000Paver-1.2.1/paver/docs/_static/file.png0000644000175000017500000000061012152705750020067 0ustar almadalmad00000000000000PNG  IHDRabKGD pHYs  tIME  )TIDAT8˭J@Ir('[ "&xYZ X0!i|_@tD] #xjv YNaEi(əy@D&`6PZk$)5%"z.NA#Aba`Vs_3c,2mj [klvy|!Iմy;v "߮a?A7`c^nk?Bg}TЙD# "RD1yER*6MJ3K_Ut8F~IENDB`Paver-1.2.1/paver/docs/_static/pygments.css0000644000175000017500000000753412152711213021025 0ustar almadalmad00000000000000.highlight .hll { background-color: #ffffcc } .highlight { background: #eeffcc; } .highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ .highlight .o { color: #666666 } /* Operator */ .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #007020 } /* Comment.Preproc */ .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .go { color: #333333 } /* Generic.Output */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #0044DD } /* Generic.Traceback */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #007020 } /* Keyword.Pseudo */ .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #902000 } /* Keyword.Type */ .highlight .m { color: #208050 } /* Literal.Number */ .highlight .s { color: #4070a0 } /* Literal.String */ .highlight .na { color: #4070a0 } /* Name.Attribute */ .highlight .nb { color: #007020 } /* Name.Builtin */ .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ .highlight .no { color: #60add5 } /* Name.Constant */ .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #007020 } /* Name.Exception */ .highlight .nf { color: #06287e } /* Name.Function */ .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #bb60d5 } /* Name.Variable */ .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #208050 } /* Literal.Number.Float */ .highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */ .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */ .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ .highlight .sx { color: #c65d09 } /* Literal.String.Other */ .highlight .sr { color: #235388 } /* Literal.String.Regex */ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */Paver-1.2.1/paver/docs/_static/default.css0000644000175000017500000000771012152711214020600 0ustar almadalmad00000000000000/* * default.css_t * ~~~~~~~~~~~~~ * * Sphinx stylesheet -- default theme. * * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: sans-serif; font-size: 100%; background-color: #11303d; color: #000; margin: 0; padding: 0; } div.document { background-color: #1c4e63; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } div.body { background-color: #ffffff; color: #000000; padding: 0 20px 30px 20px; } div.footer { color: #ffffff; width: 100%; padding: 9px 0 9px 0; text-align: center; font-size: 75%; } div.footer a { color: #ffffff; text-decoration: underline; } div.related { background-color: #133f52; line-height: 30px; color: #ffffff; } div.related a { color: #ffffff; } div.sphinxsidebar { } div.sphinxsidebar h3 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.4em; font-weight: normal; margin: 0; padding: 0; } div.sphinxsidebar h3 a { color: #ffffff; } div.sphinxsidebar h4 { font-family: 'Trebuchet MS', sans-serif; color: #ffffff; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { color: #ffffff; } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 10px; padding: 0; color: #ffffff; } div.sphinxsidebar a { color: #98dbcc; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } /* -- hyperlink styles ------------------------------------------------------ */ a { color: #355f7c; text-decoration: none; } a:visited { color: #355f7c; text-decoration: none; } a:hover { text-decoration: underline; } /* -- body styles ----------------------------------------------------------- */ div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Trebuchet MS', sans-serif; background-color: #f2f2f2; font-weight: normal; color: #20435c; border-bottom: 1px solid #ccc; margin: 20px -20px 10px -20px; padding: 3px 0 3px 10px; } div.body h1 { margin-top: 0; font-size: 200%; } div.body h2 { font-size: 160%; } div.body h3 { font-size: 140%; } div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #c60f0f; color: white; } div.body p, div.body dd, div.body li { text-align: justify; line-height: 130%; } div.admonition p.admonition-title + p { display: inline; } div.admonition p { margin-bottom: 5px; } div.admonition pre { margin-bottom: 5px; } div.admonition ul, div.admonition ol { margin-bottom: 5px; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 5px; background-color: #eeffcc; color: #333333; line-height: 120%; border: 1px solid #ac9; border-left: none; border-right: none; } tt { background-color: #ecf0f3; padding: 0 1px 0 1px; font-size: 0.95em; } th { background-color: #ede; } .warning tt { background: #efc2c2; } .note tt { background: #d6d6d6; } .viewcode-back { font-family: sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; }Paver-1.2.1/paver/docs/_static/comment-close.png0000644000175000017500000000677212152705750021734 0ustar almadalmad00000000000000PNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME!,IDAT8e_Hu?}s3y˕U2MvQ֊FE.łĊbE$DDZF5b@Q":2{n.s<_ y?mwV@tR`}Z _# _=_@ w^R%6gC-έ(K>| ${} H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME 1;VIDAT8ukU?sg4h`G1 RQܸp%Bn"bЍXJ .4V iZ##T;m!4bP~7r>ιbwc;m;oӍAΆ ζZ^/|s{;yR=9(rtVoG1w#_ө{*E&!(LVuoᲵ‘D PG4 :&~*ݳreu: S-,U^E&JY[P!RB ŖޞʖR@_ȐdBfNvHf"2T]R j'B1ddAak/DIJD D2H&L`&L $Ex,6|~_\P $MH`I=@Z||ttvgcЕWTZ'3rje"ܵx9W> mb|byfFRx{w%DZC$wdցHmWnta(M<~;9]C/_;Տ#}o`zSڷ_>:;x컓?yݩ|}~wam-/7=0S5RP"*֯ IENDB`Paver-1.2.1/paver/docs/_static/comment-bright.png0000644000175000017500000000665412152705750022105 0ustar almadalmad00000000000000PNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME 6 B\<IDAT8˅Kh]es1mA`jh[-E(FEaA!bIȐ*BX"؁4)NURZ!Mhjssm؋^-\gg ]o|Ҭ[346>zd ]#8Oݺt{5uIXN!I=@Vf=v1}e>;fvnvxaHrʪJF`D¹WZ]S%S)WAb |0K=So7D~\~q-˟\aMZ,S'*} F`Nnz674U]VX\Ż:D <ňο2pL[3 GC3* WԾ9ު]|J-%EE5ku1 5X?ŵjJ' WW>ѢG1j=ķY6<{O0)#+(b;+뎣5Wq]E,ۧ;N5uM \yQ ( (PyeS@= -Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@յ2H@I>!xA!y[dFUdY3 "zb䔥蛻ƅIAEvPAVNXh:9j8HހU'QB);$VةRIA]C=k!p5ŋlK<0,ܖ?*_|ѯ|t5#.ByDó\9XS9am7q҇!K&5.JkRWm}1B7܏5?ܖKH }?,לk5O,_`Ѭ<>Q]U+|EYRh> =zG$>$nI6z]W:eZ'\Ds5qx`_9_#\JQ\ҧ9=5<>NVK}T7L#Τ˛G׵=7YN6݈&^XmlwBʏr@ Gj]zI#i}7ԑIIt8%vUd)?l7IxRR^gTcnkyE%4#~az^ȇ͞BXǍwb]a_0X֟=(cN^q}") ;COx5/ROiW/~Ikt-'L3VlW^8cml5cIT5KEׇ>|?ǏZZt oyB!O5قaC+Iʵgʮݒ'%vdClf+ɨ魒ZoauC/ßdDE:#\s_xbB#=XKC4u[Ry#3gidr9y6}Q /u܍_Wl?ězS5;r ՛{WM׊VՏŨp36ĺg-yR֧^=ɥi\7i.h?Ey0_XZ44 7̍$9?|w{s-ui~k/'l$z4Y^Οt& u4^tM+ٽ'޿$]lտoi^ҏr A'*I?iyLSSƴ@>?tV9?b3e}]zsb+֨UO>Q2^Kþ;AՎc~B 3GeЯ^}6R=Dw ,j9^ IqE =ౘԥZ/jFI)+VC<Z _dN?Vu}J-3SItZN#.cq}:W杮>׾<%xϽ\ y5l]u<eaeae|%R\~>>nG5^RJ5R%~ky7ժ<6 yc[52 "M/L./곶^ zy |G?XC)Gz>,x+9Od4_uՙ;[ YҪдQE}!QEQEQEQEQEQEQEQEQEQEQEQETr1&8ug`hhMK (h෍w< **T"'dmm[]81|+μmANzWIhFu5HH2_N>=%?m.v5d)Ho/Ok^gX /ŲQuʩj,A-+*OpO;;wjyoo{ӏ3tIhKC찘 xzQ/0d?u@?ATgHGg`ƣbp}Mw _E&-F-- P~Ÿ$ x}jaJbm_һ<9Q :\!=V^֝μmԏn~m*aP[3TU#o']_ Q_>"ߪ,AJ+cu.HI=gZ.w}-dߕq^&wrhh |%ڬ_c--ɋ`1RIgvrhςnu>3{xBV2Hҗ>DјeY"> :޷[0.,V%Jb2N9+-FlGѡQlyӁbD3_A'?0sfx̕ kk^E+jg LdjJ/-ihyq4 ?=vچ%d h79''ֱ"! K)vI<BMZ1V_l(o.ȿyG>x_VO5l-'$苞3Oǭe^PMnXԝJ$dez~:EgwN#SvnX!<)myt +8"i'yLB4Qf|I*qJ/59-וާ>-Ez>e'sV5;i]Jd[]&V^L<'GaJ5"O_2Uo 4!KYl=A|sG3Ҍ]ѴJhzWD8!xGXyuk!d~e<ԁ-Wן!~:kvu%v ~jk1H|M⻭BYS;wsd9^ѻ2pkc諏O5ͰԷE&k Dyz6[QEjQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@PI'^o^[u;pXD__5ƍ/i:{kEnf{v)Sr@8i~7OqHgV6zvT+ ڶySQ|H|s<_0GR^yM&黌mtӯpl'+g]?DfCacQ9ObK.^O2vt5̘DAzH2M6}n[iuˋki]G9*OQ$x*l2+}|՘ĜbQwƕa0tv{=nHp/Y{{GwzmJ+[iH%#}dL:qd#fbxrMQOr+[ÚO$tA?ҵC ܪ7WTr [%{ (Dߛ=fWɮ\ЋjJ턴Y;3t9>~ΗNj̒k*';s4P*:T$~=ڔ$#RBH|D)8#by }L|`])]e[+ݡffcVaSiW4F/)w\zFgT2jv~~Ke}jqMkj|i0nY*Nm+od;|GgьIV+ YF&/4eB ir%ϩzӭ K{ b(Wm#v=٘'$j!>3{⡸kД(l= zQc+ʞ 5=e۫OW.Y?z{yG߿iy稬ԛw#@xYҴ[wGBQo_|`4G6k~(& mgIg}$WXFtn,Xɸ+RlZCȰ%)>Y]8J6j"eWG\|e5ZpkʄPG/X~|=@H7k&԰6LΥ#>PU6zWhZE׈Wo[3F繙@=5|L^&g-VizH+Y^8=(9Se7vI{-Z>C ۔}ߞSC⛻)oj7>#6 #.m=}b_RSx΍Õ- M띻9;-v!|Wsm-*gv\0# a ͌E C G (0ơUG)kӆ1U{m{[\8 IkE|_3I8q'+Od}/R_*#DAv'@'\ Q46آK<kش-J/xx#IǫbMNkR,=U}kN0ϞgrNWZ(x>L(((((((((hdyQw;QM)IE6ݒW$g_f]M[FrZ|M94T'_[]Yxnkyk88>P7/אDc: f Yi*Pmnm8sXz?^~0[k;-%vDEWɾ!4YzdoGVԸۂ;.iyrKOjWwzƷ:P} z"_lV|M*c+2NhlXUܼ#rI>bIIepv'5OZz"X mߵXy3SަTTz+Sʥ-Gj: b}cXp}tV+X];m={'/w> Gcj ^f9FsVbO>Cp}|6p`}|2Z}Le=>4m;zd NA<݁ ?*xu)Lfs6xЎYi? q*ZO#ok|`_3H9W#w{Fެ3Yg[@O a<}IOsSuqOኲ?Wg.OV6̀Iz/ywVr!B i^x:_s-nHr?*=koNOˍZ"Xl8kOOMZ4tQ}G9C W%yahZY"s B 3,6P[Ɛ5 `Vzyq{yjX_N (EG|/˲`uwӢlN5o|3C̭~(ZMxU_\ŜqSP=̂+h#w'c&OzU~!\IU;xc{*fSVK>"Ww.ND2yN֓Weע3~#:7GY_MnmQE[bi ݮ% .5cDo~x?M6A$pkABD`;aʒ;?x JĚx~nNW|=p+xT^wHwklC K7nfN, .zx7z?8bܭ;UU\/vZVDQSߥgJC'ҲW?/@H3TTRI~񎭱om'rcFyEy$֡ohjtTł*:Yn"} ?K ?Pl ~7!m[Hd1Կ<5 |qěźc7>JuQ]U㟍v"hw^𶀍?|AI|($ .NP3m!5IuIzq\:pKs|dnŶbiԮaq dm__猾+xKdM,/me-onä - 9 ~:UfhqJw]jιH$^q_ pUIqKH:mi;ϜAO/߫l4l% qڬE~|QEQEQEQEQEQEQH 1 dxj>7֚ΒQ*L35β׍(wW6Z\β򋟋dSW<1?M]ڥL$?e'܁_!cqҔމs_e};p[z*eipPZJ' rB<6M+q"vckϊ,t{WUÖ(г9;QU/#=}Sq̡ xBSW?a _[IZS:F.~Yn<L_A<= ^Sooq9]|p&qnF~cq _}'_7 h+kǩjO^ msT1H[M#6o Ads6c]IHzkoGm½UZxj2WH]]Kz/_3Ѿi||LeZmvO4\|ih p:wuxTϢ_㷉݇`ۨksϕ Y&ŌI5-CWu?jd@8W*{OsN^+-4ov'?>HNz.i7j稫SsĚ曠7wK)c˹@<:W\+mW]})`U1WOxO!1.Ȓ쐀pc5ڟj xf5 >R)\_71S)YG Ӵӓ}k}5?3L9CN3IVV蹥ee|"[:OMAUO_B/=zT)LJOK {(2Ȭpy__xڌZvOx{V(l>{wf)9⾢4=?  q}.6n뫆2{kW|R< qwTӌ)retoioOK?yi%k=wƟ]ᕯ|׷𵾌/ԑ r@O S:_j:ꫳVn ϔX#ɞ[ݮ[sAaoWH>T3о;W׋=K9+9[`},Qg^pp_om叟K{tw6.4cVs ~);%?Y8P*Uߢ4F|^bTLq_jv'?);$I+(lqfϢْ{E+p c_k5ׅ|sxni[LRg*+WY G-x^38OquhTݻ}RZQC(U TYo)abQj~>b8w[E_2o#tzEf#L?|zW];'<7cC bc4=D1LExO]2-a7-0Zj) )RAdžR/6s $Xp7ʘF=p_JRz]E&z}k5|u)M7~3;t? 3 f1,bPvYcV}{~/xRk(-[FOsS__-}Ő$,+/|Jѵ/^iZ|~]}D_ïˇeajJNxڎthV&Sݟn8TsFz>:xto ݹt2곣I )G"CgeH*"T`:US]5iVVv?j?6$-ܤw3%Yyv_/֔*f dzV{]n⠣I`3W!#HP]9Yi`7';a_Bz:"M[Ǖ:#ՙ<%ş&y;KEqǹq)QںG4ن:ey$xXPc#)U`渿0z=^It$nJ0Ǟף[ ҕ6ںj}t}=|,OJ\Z7u4:MOZu?hbea'?g Eup=;3ޮ4#Y-԰xP#Eݮ X1aܞھf7GDž#VFM2ܸD>lz^OGi{Zh)cbGϹ$P?ǩ~̾@jߴ/-f 0"V63 5x}Ox890N)}=o#>7QoB_ Y|^~$sϟ-ωAS[rHǩ9,Tywdu|7[6!3}ƶ6ꚅϕ Qǩ>ֿ.uKk:`jz\\x<,c*eC'\Q3/zpΧےj_EZtV,yhgg|ײ?0`=3TO3ޟE=y3޺xj_F!fiNhAg1GԞƱN RQ1Wl1TpXyתg孎{_xOpB0(&[O@@ z5k|5ψ,W._ۼZ7#kYhH~oo,o7%h0F_x{ml&cҐ /i,O*5e6@EE\ʬWbr*\qu^$Uҡkw'}^JOeo<YK$V7-2;lQq&k>x\#iqhv3lz/b+>KE|Ww$j3!3nl[YNmh{mVMܸ"0өȭ뷞޺9ʨYUI8?Xh^>$egY $6qMbzisK6U8"}bCSZo~O!u+ajn-`AV*$׷omzX.*5$1Pݴލdu?(X ѲMlWf?7esErK,pZF%F݀3U)jb#(~ޗ:zZ{\$ཚ8m$ַ/ۯ:F<[L#>7Xa쑧xX?Z}>&b:%f9Rp7s_pØn#)C8r_'tbN5nM_@+9Š(((()O#TPK1IWUއ[mJ"!~_?7'[Ѵ\hmWg T`[$|R:GsĒlWo"gwvi9idbYݏ1$k*yz)Bޣ]oitiSG>+.<}h7}\DM3ޚEid\ʰZG`lj:!h-:iceڄ1_cC M/'/kb:i_=C|%oCA.. wܱ{ӭ'*\L6vuUQIok|.ω-i%őr;UQ $6ޥQg߹5Y%rz+.]Sx>QJQ;_%؟M6τ?fh1FXiGC1]~=E6ke(61{O_7 u[?k_qlՆ~otED 鞦ߋ0.o. DK379#Oz)C *N]jjVi>^R}Kg_'3K.n&2L>oM7T|CS:+<{"_=HfKhDNpBI\~2L`0PZտ><C(`+f|hyZ/W|G4qqc24+ُv>qOa9=M6t߉O%ΠOwv%m,UʽKA9p6njRfL{D$1_{n/ $gK7V|B>K3^POҾ|+z7 %6_hg;)5qYVwP7K%~+~=ᆴ}=}E~'? <j'S[Kb}5 zm%^i|2`t*6I ~T:>>gVV4ˏxzzy9'{ `F"(~Ekg⤵䏹O~/=74$3n_q_|'D'Mc'gkoU(2f$UE¨^ʠWؼYIo?PF=fS<'Ԙ8~aӢc}Ŵk59wpJj-]׿nƇH]_C4h8jMOeg9g+Sv$((8w8w!n '1\9|O?ƨ! [D#PJ+(((((9f8i>.~&$+=þ%Y鰓RvD'`O$?*d|1,.b߲{K$~IULلW-uw|WOoc] m_ԣm<=}UiYYy.'{g$3w>?#&w`,}+U<V}_ݟ pʲx~^O^HgǞ/Hњxe&;dbB9wb 1В@Ot}Tӿ"I J:'|$%ms{ X_jXg۟:M2t$Sfq ǜ,0dt@FGUF'˟s<2swqf㦋kWӫ??^7ݢud|$bi$r,ܳ{ 6XR}x_YyOom?O%=2~F_SN4F)$pXaF*}[Ֆ& 5e=΢(fVv q]ww2/0{o7޽/7:ONҎG׷g!1_ kenJm|4خ[ģ7B{ïQ'1¾77t+u`DRS#x̉\K;s^/ُ>>t_+ mL yfސ`+m/4M,aPoE}+7/qx,Ǝu5J(}[R]-IVL;o1I-ɾ̺oNcmGjo~%߂4MSOm5V]HS.~dH$d gx yx^y릴`z,?_KoYTb2D!SKn_yYKޏ.V}յ8K)e9EVzzX.+.Ms ^^k?xJˆ[7{B\|9,|)uX=[M񖴇w=2½O4&->T ~U7wZ=:Y犙a+7&ܶGúW¿6x{^'}l+ռ3(4ҵ8u_]!kVP++v)e(R̕f'gcs\^-޵F/c7N"-:T ~UEGQEQEQEQEQEQEQEQEQEQEQEQEQEq;Nnq W%{}#O_j[XvVH]^C ~իW!v G"R{?sqS=|OǵEކ{(vuN݋?>Ԏ߫ wQ]Cf~šYV v;C~{Z%bdO18RYr$ΥVN׵n\-b(a)]Owkmzc|GEu*Nd'|al7=KeWidi%سHrI$ORk8^~8oQxx{W%dny/8TW4{/%w4|}'ᄚi[ĎM=x 4# +{׏/!qc_U !V>@&cx!a7\.[\\'ઐW1ձ[UN[>ֿIo~_|PO-kx/}zUcெud,8i'lq/19+>VյCW'F}pR 0vU{gï|M| ^m58yϘ=k_8s9*/UExM¯ yX>(񞦓CMivQTO@M~.RvH3 o uxO5??Fí\/^A?kDozCg $1|#;]$pyX,ԡB\ bz+o]LYfX/(5/mlΤPF{>'$m ڝG`P~4C}+ Pͤ|?>qT^^0`8Zѓ>1lDm,zt1~tUaھt|5>#F~ʬR3yjWR_b +/Is_#K c2F/Du36hm]/PQ'6IS_qRL~6zַǺn^jڝJZۀdM†H.O^vGcğo?:M%.BZ3do԰ȿl1ͱ15mv^gq.[5JyvOs|Avxz 9eƭuFL+־߁ZMkLvK-wq',%}7G7%'xn-<6zÁؐ}Ec5J|Ksu߈V6\ڀ;*a_pM75?5n=|@Ti?wW½^|dϬ /M$OϫE}'>xN-' >y1J{7RI^UB8}\ a2:R}'ӥqʜwz.EWAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYΣ{FLbN+N⮯:,G-+y2~y?|'_ff߽s\|c)޾|8W0ٖMD; cn3_ 4xxׯ`K0l HKa=j#ܞx,I_4? qe 98U}hy}_SXSxkρ_A,n&&8d=#yO@.{mAߴ7>#Ծ|/mq?OAd9v{bNI5Cf #HbNa8OWI | .𭕽-4[l`pM}m ;k.ׁx{ gѬg2h~-mn`p9rz4-W7Tov2~I+E͢Y75k|VvI1id<īÎ'_]|uK7cOy"}#3oL,;ڪnşx+’3pkIG^܏D=O;8T^¿љlZGlkb*0NO++qr*jѧ_7d̲6^ + ![YIy񳎪?^ӥO~ E.c{Xy */c| dwk.YXܟ,Trq_^4 h:E*#(]6G=:ҕ)ӡv6M֮y4 fBNi.c>`e-[Xܠ[=<v[>TAܓ}tOҝ *fn/ G9?_S5RvJ*F)-c#M'|BS |7c.vb#cW!pB;>+|I#K;Y{y'޽WЬ VP{;pן+଻Y|F*N_{Tۥ pdr8FҪ=M{GOњ``5+*(ޓ |;k-tt˭gWdAE ?NJ/ٻx'[Z%g0&ȩ8bĀp x: ZфnNײuk2*uWKM_]ntf>6GO 7 q:ڔɘ?b=.{$jI :qýO*E?^ɬjef/' WK}14 afm&:'_qDž<=C9H4ݕ¬?Ό;px5YOJ#MOQ?d }eciiYkk(**ud  JF*}[սY#VGRVQEz!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEuH܅E=&W`xoōX6gfГ?oyz1D=EVj6~!zs:ٺqVnv0QU@U¿f@_Q~? =Ll){_3Kd cDԱNi[<ɜBC_..!Ed |~H'Kោ~OofeeS9pk(WS#?c*FMs?E}_3i;_+['Lj}VxOԟjBAbxa$Yͩ8h_gŷȚNھ]ݵZ@&B\__O ^[f$ӟ fx?< X;mBuC~ |$:O4AOݛ}d"t:Wh 6^M|!LL_TOIn8V0?56 x7em;:;wi<.ZRCv3ͭ|.UsIimNm;=pE15M[?:Pİ3K#Mv2N[l{W x _<#Ycn K l#ß :>}1ɨt}g?ūx)ՉA%G|/L!W/:u֯_5֯ݶgs۹'5|cq>whn\Kd>(ϊwehߕEl{{_=Q_FF"cxQy;Sdw"S׳\ BJԸT>c Iž4x`-EtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEDUk"ʺ H2'i^U]OPFE|W&]DsjIQ٫ٿS: =ת?2l[}|2{n=q4{k)EwO|k a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .field-list ul { padding-left: 1em; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px 7px 0 7px; background-color: #ffe; width: 40%; float: right; } p.sidebar-title { font-weight: bold; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px 7px 0 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- tables ---------------------------------------------------------------- */ table.docutils { border: 0; border-collapse: collapse; } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.field-list td, table.field-list th { border: 0 !important; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } table.citation { border-left: solid 1px gray; margin-left: 1px; } table.citation td { border-bottom: none; } /* -- other body styles ----------------------------------------------------- */ ol.arabic { list-style: decimal; } ol.loweralpha { list-style: lower-alpha; } ol.upperalpha { list-style: upper-alpha; } ol.lowerroman { list-style: lower-roman; } ol.upperroman { list-style: upper-roman; } dl { margin-bottom: 15px; } dd p { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dt:target, .highlighted { background-color: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .refcount { color: #060; } .optional { font-size: 1.3em; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } .guilabel, .menuselection { font-family: sans-serif; } .accelerator { text-decoration: underline; } .classifier { font-style: oblique; } abbr, acronym { border-bottom: dotted 1px; cursor: help; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; overflow-y: hidden; /* fixes display issues on Chrome browsers */ } td.linenos pre { padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { margin-left: 0.5em; } table.highlighttable td { padding: 0 0.5em 0 0.5em; } tt.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } tt.descclassname { background-color: transparent; } tt.xref, a tt { background-color: transparent; font-weight: bold; } h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { background-color: transparent; } .viewcode-link { float: right; } .viewcode-back { float: right; font-family: sans-serif; } div.viewcode-block:target { margin: -1px -10px; padding: 0 10px; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } }Paver-1.2.1/paver/docs/_static/down-pressed.png0000644000175000017500000000056012152705750021566 0ustar almadalmad00000000000000PNG  IHDRasRGBbKGDC pHYs B(xtIME -vF#IDAT8!OAJ, ++@I vbÿ@W7F HN#48646TMvv޼7Dsax1U q;< E-f)j%po4xF78G>)- EYm4%7YTk-Qa"NWAo-yeq,) Ypt\hqmszG]Nar߶s^l vh\2%0EeRvIENDB`Paver-1.2.1/paver/docs/_static/plus.png0000644000175000017500000000030712152705750020136 0ustar almadalmad00000000000000PNG  IHDR &q pHYs  tIME 1l9tEXtComment̖RIDATcz(BpipPc |IENDB`Paver-1.2.1/paver/docs/_static/ajax-loader.gif0000644000175000017500000000124112152705750021321 0ustar almadalmad00000000000000GIF89aU|NU|l!Created with ajaxload.info! ! NETSCAPE2.0,30Ikc:Nf E1º.`q-[9ݦ9 JkH! ,4N!  DqBQT`1 `LE[|ua C%$*! ,62#+AȐ̔V/cNIBap ̳ƨ+Y2d! ,3b%+2V_ ! 1DaFbR]=08,Ȥr9L! ,2r'+JdL &v`\bThYB)@<&,ȤR! ,3 9tڞ0!.BW1  sa50 m)J! ,2 ٜU]qp`a4AF0` @1Α! ,20IeBԜ) q10ʰPaVڥ ub[;Paver-1.2.1/paver/docs/_static/doctools.js0000644000175000017500000001473412152705750020642 0ustar almadalmad00000000000000/* * doctools.js * ~~~~~~~~~~~ * * Sphinx JavaScript utilities for all documentation. * * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * select a different prefix for underscore */ $u = _.noConflict(); /** * make the code below compatible with browsers without * an installed firebug like debugger if (!window.console || !console.firebug) { var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; window.console = {}; for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {}; } */ /** * small helper function to urldecode strings */ jQuery.urldecode = function(x) { return decodeURIComponent(x).replace(/\+/g, ' '); }; /** * small helper function to urlencode strings */ jQuery.urlencode = encodeURIComponent; /** * This function returns the parsed url parameters of the * current request. Multiple values per key are supported, * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { if (typeof s == 'undefined') s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; for (var i = 0; i < parts.length; i++) { var tmp = parts[i].split('=', 2); var key = jQuery.urldecode(tmp[0]); var value = jQuery.urldecode(tmp[1]); if (key in result) result[key].push(value); else result[key] = [value]; } return result; }; /** * highlight a given string on a jquery object by wrapping it in * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { function highlight(node) { if (node.nodeType == 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { var span = document.createElement("span"); span.className = className; span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this); }); } } return this.each(function() { highlight(this); }); }; /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated == 'undefined') return string; return (typeof translated == 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated == 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) == 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this == '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); Paver-1.2.1/paver/docs/_static/sidebar.js0000644000175000017500000001123112152711213020401 0ustar almadalmad00000000000000/* * sidebar.js * ~~~~~~~~~~ * * This script makes the Sphinx sidebar collapsible. * * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton * used to collapse and expand the sidebar. * * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden * and the width of the sidebar and the margin-left of the document * are decreased. When the sidebar is expanded the opposite happens. * This script saves a per-browser/per-session cookie used to * remember the position of the sidebar among the pages. * Once the browser is closed the cookie is deleted and the position * reset to the default (expanded). * * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ $(function() { // global elements used by the functions. // the 'sidebarbutton' element is defined as global after its // creation, in the add_sidebar_button function var bodywrapper = $('.bodywrapper'); var sidebar = $('.sphinxsidebar'); var sidebarwrapper = $('.sphinxsidebarwrapper'); // for some reason, the document has no sidebar; do not run into errors if (!sidebar.length) return; // original margin-left of the bodywrapper and width of the sidebar // with the sidebar expanded var bw_margin_expanded = bodywrapper.css('margin-left'); var ssb_width_expanded = sidebar.width(); // margin-left of the bodywrapper and width of the sidebar // with the sidebar collapsed var bw_margin_collapsed = '.8em'; var ssb_width_collapsed = '.8em'; // colors used by the current theme var dark_color = $('.related').css('background-color'); var light_color = $('.document').css('background-color'); function sidebar_is_collapsed() { return sidebarwrapper.is(':not(:visible)'); } function toggle_sidebar() { if (sidebar_is_collapsed()) expand_sidebar(); else collapse_sidebar(); } function collapse_sidebar() { sidebarwrapper.hide(); sidebar.css('width', ssb_width_collapsed); bodywrapper.css('margin-left', bw_margin_collapsed); sidebarbutton.css({ 'margin-left': '0', 'height': bodywrapper.height() }); sidebarbutton.find('span').text('»'); sidebarbutton.attr('title', _('Expand sidebar')); document.cookie = 'sidebar=collapsed'; } function expand_sidebar() { bodywrapper.css('margin-left', bw_margin_expanded); sidebar.css('width', ssb_width_expanded); sidebarwrapper.show(); sidebarbutton.css({ 'margin-left': ssb_width_expanded-12, 'height': bodywrapper.height() }); sidebarbutton.find('span').text('«'); sidebarbutton.attr('title', _('Collapse sidebar')); document.cookie = 'sidebar=expanded'; } function add_sidebar_button() { sidebarwrapper.css({ 'float': 'left', 'margin-right': '0', 'width': ssb_width_expanded - 28 }); // create the button sidebar.append( '
«
' ); var sidebarbutton = $('#sidebarbutton'); light_color = sidebarbutton.css('background-color'); // find the height of the viewport to center the '<<' in the page var viewport_height; if (window.innerHeight) viewport_height = window.innerHeight; else viewport_height = $(window).height(); sidebarbutton.find('span').css({ 'display': 'block', 'margin-top': (viewport_height - sidebar.position().top - 20) / 2 }); sidebarbutton.click(toggle_sidebar); sidebarbutton.attr('title', _('Collapse sidebar')); sidebarbutton.css({ 'color': '#FFFFFF', 'border-left': '1px solid ' + dark_color, 'font-size': '1.2em', 'cursor': 'pointer', 'height': bodywrapper.height(), 'padding-top': '1px', 'margin-left': ssb_width_expanded - 12 }); sidebarbutton.hover( function () { $(this).css('background-color', dark_color); }, function () { $(this).css('background-color', light_color); } ); } function set_position_from_cookie() { if (!document.cookie) return; var items = document.cookie.split(';'); for(var k=0; k0 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 var s_v = "^(" + C + ")?" + v; // vowel in stem this.stemWord = function (w) { var stem; var suffix; var firstch; var origword = w; if (w.length < 3) return w; var re; var re2; var re3; var re4; firstch = w.substr(0,1); if (firstch == "y") w = firstch.toUpperCase() + w.substr(1); // Step 1a re = /^(.+?)(ss|i)es$/; re2 = /^(.+?)([^s])s$/; if (re.test(w)) w = w.replace(re,"$1$2"); else if (re2.test(w)) w = w.replace(re2,"$1$2"); // Step 1b re = /^(.+?)eed$/; re2 = /^(.+?)(ed|ing)$/; if (re.test(w)) { var fp = re.exec(w); re = new RegExp(mgr0); if (re.test(fp[1])) { re = /.$/; w = w.replace(re,""); } } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1]; re2 = new RegExp(s_v); if (re2.test(stem)) { w = stem; re2 = /(at|bl|iz)$/; re3 = new RegExp("([^aeiouylsz])\\1$"); re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re2.test(w)) w = w + "e"; else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); } else if (re4.test(w)) w = w + "e"; } } // Step 1c re = /^(.+?)y$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(s_v); if (re.test(stem)) w = stem + "i"; } // Step 2 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step2list[suffix]; } // Step 3 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step3list[suffix]; } // Step 4 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; re2 = /^(.+?)(s|t)(ion)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); if (re.test(stem)) w = stem; } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1] + fp[2]; re2 = new RegExp(mgr1); if (re2.test(stem)) w = stem; } // Step 5 re = /^(.+?)e$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); re2 = new RegExp(meq1); re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) w = stem; } re = /ll$/; re2 = new RegExp(mgr1); if (re.test(w) && re2.test(w)) { re = /.$/; w = w.replace(re,""); } // and turn initial Y back to y if (firstch == "y") w = firstch.toLowerCase() + w.substr(1); return w; } } /** * Simple result scoring code. */ var Scorer = { // Implement the following function to further tweak the score for each result // The function takes a result array [filename, title, anchor, descr, score] // and returns the new score. /* score: function(result) { return result[4]; }, */ // query matches the full name of an object objNameMatch: 11, // or matches in the last dotted part of the object name objPartialMatch: 6, // Additive scores depending on the priority of the object objPrio: {0: 15, // used to be importantResults 1: 5, // used to be objectResults 2: -5}, // used to be unimportantResults // Used when the priority is not in the mapping. objPrioDefault: 0, // query found in title title: 15, // query found in terms term: 5 }; /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } }, loadIndex : function(url) { $.ajax({type: "GET", url: url, data: null, dataType: "script", cache: true, complete: function(jqxhr, textstatus) { if (textstatus != "success") { document.getElementById("searchindexloader").src = url; } }}); }, setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); } }, hasIndex : function() { return this._index !== null; }, deferQuery : function(query) { this._queued_query = query; }, stopPulse : function() { this._pulse_status = 0; }, startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { var i; Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); } pulse(); }, /** * perform a search for something (or wait until index is loaded) */ performSearch : function(query) { // create the required interface elements this.out = $('#search-results'); this.title = $('

' + _('Searching') + '

').appendTo(this.out); this.dots = $('').appendTo(this.title); this.status = $('

').appendTo(this.out); this.output = $('