zc.buildout的一组helper接收
lovely.recipe的Python项目详细描述
文件系统构建方法
创建目录
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = data-dir ... find-links = http://download.zope.org/distribution ... ... [data-dir] ... recipe = lovely.recipe:mkdir ... path = ${buildout:directory}/mystuff ... """) >>> print system(buildout), Installing data-dir. data-dir: Creating directory /sample-buildout/mystuff>>> ls(sample_buildout) - .installed.cfg d bin - buildout.cfg d develop-eggs d eggs d mystuff d parts
如果更改目录名,则不会删除旧目录(“mystuff”)。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = data-dir ... find-links = http://download.zope.org/distribution ... ... [data-dir] ... recipe = lovely.recipe:mkdir ... path = ${buildout:directory}/otherdir ... """) >>> print system(buildout), Uninstalling data-dir. Installing data-dir. data-dir: Creating directory /sample-buildout/otherdir>>> ls(sample_buildout) - .installed.cfg d bin - buildout.cfg d develop-eggs d eggs d mystuff d otherdir d parts
我们还可以创建完整的路径。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = data-dir ... find-links = http://download.zope.org/distribution ... ... [data-dir] ... recipe = lovely.recipe:mkdir ... path = ${buildout:directory}/with/subdir ... """) >>> print system(buildout), Uninstalling data-dir. Installing data-dir. data-dir: Cannot create /sample-buildout/with/subdir. /sample-buildout/with is not a directory. While: Installing data-dir. Error: Invalid Path
但我们需要明确地激活这个函数。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = data-dir ... find-links = http://download.zope.org/distribution ... ... [data-dir] ... recipe = lovely.recipe:mkdir ... createpath = True ... path = ${buildout:directory}/with/subdir ... """) >>> print system(buildout), Installing data-dir. data-dir: Creating parent directory /sample-buildout/with data-dir: Creating directory /sample-buildout/with/subdir>>> ls(sample_buildout) - .installed.cfg d bin - buildout.cfg d develop-eggs d eggs d mystuff d otherdir d parts d with >>> ls(sample_buildout + '/with') d subdir
没有更新方法,因此在更新时使用install方法 目录被重新创建。
>>> rmdir(sample_buildout + '/with') >>> print system(buildout), Updating data-dir. The recipe for data-dir doesn't define an update method. Using its install method. data-dir: Creating parent directory /sample-buildout/with data-dir: Creating directory /sample-buildout/with/subdir
如果以根用户身份运行,我们可以更改所创建目录的所有者。这是经过测试的 在mkdir-root.txt中。
如果不是以根用户身份运行,则设置所有者是一个错误:
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = data-dir ... find-links = http://download.zope.org/distribution ... ... [data-dir] ... recipe = lovely.recipe:mkdir ... createpath = True ... path = ${buildout:directory}/another/with/subdir ... owner = nobody ... """) >>> print system(buildout), While: Installing. Getting section data-dir. Initializing part data-dir. Error: Only root can change the owner to nobody.
当用户不存在时是一个错误:
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = data-dir ... find-links = http://download.zope.org/distribution ... ... [data-dir] ... recipe = lovely.recipe:mkdir ... createpath = True ... path = ${buildout:directory}/another/with/subdir ... owner = someuser ... """) >>> print system(buildout), While: Installing. Getting section data-dir. Initializing part data-dir. Error: The user someuser does not exist.
创建文件
mkfile配方创建一个或多个具有给定路径、内容和 权限。
注意父目录需要存在,否则用户错误 是升起的。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = script ... ... [script] ... recipe = lovely.recipe:mkfile ... path = /x/y/file.sh ... content = hoschi ... mode = 0755 ... """) >>> print system(buildout) Uninstalling data-dir. Installing script. script: Cannot create file /x/y/file.sh. /x/y is not a directory. While: Installing script. Error: Invalid path>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = script ... ... [script] ... recipe = lovely.recipe:mkfile ... path = file.sh ... content = hoschi ... mode = 0755 ... """) >>> print system(buildout) Installing script. script: Writing file /sample-buildout/file.sh <BLANKLINE>>>> ls(sample_buildout) - .installed.cfg d bin - buildout.cfg d develop-eggs d eggs - file.sh d mystuff d otherdir d parts d with
内容写入文件。
>>> cat(sample_buildout, 'file.sh') hoschi
模式设置好了。
>>> import os, stat >>> path = os.path.join(sample_buildout, 'file.sh') >>> oct(stat.S_IMODE(os.stat(path)[stat.ST_MODE])) '0755'
如果我们更改文件名,旧文件将被删除。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = script ... ... [script] ... recipe = lovely.recipe:mkfile ... path = newfile.sh ... content = hoschi ... mode = 0755 ... """) >>> print system(buildout) Uninstalling script. Installing script. script: Writing file /sample-buildout/newfile.sh <BLANKLINE>>>> ls(sample_buildout) - .installed.cfg d bin - buildout.cfg d develop-eggs d eggs d mystuff - newfile.sh d otherdir d parts d with
我们还可以指定为文件创建路径。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = script ... ... [script] ... recipe = lovely.recipe:mkfile ... createpath = On ... path = subdir/for/file/file.sh ... content = hoschi ... mode = 0755 ... """) >>> print system(buildout) Uninstalling script. Installing script. script: Creating directory /sample-buildout/subdir/for/file script: Writing file /sample-buildout/subdir/for/file/file.sh>>> ls(sample_buildout + '/subdir/for/file') - file.sh
文件变体
一个常见的用例是一个文件的变体,例如如果init 必须创建脚本。作为一个例子,我们创建了两个文件 变化“1”和“2”。这些变体可以在文件路径中使用 并在文件内容中通过普通的字符串格式表示法。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = script ... ... [script] ... recipe = lovely.recipe:mkfile ... variations = 1 2 ... path = prod_%(variation)s.ini ... content = hoschi variation %(variation)s ... mode = 0755 ... """) >>> print system(buildout) Uninstalling script. Installing script. script: Writing file ...sample-buildout/prod_1.ini script: Writing file ...sample-buildout/prod_2.ini>>> cat(sample_buildout, 'prod_1.ini') hoschi variation 1 >>> cat(sample_buildout, 'prod_2.ini') hoschi variation 2
蛋盒构建食谱
这个菜谱是从zc.recipe.egg中派生出来的,但不是仅仅创建 路径,它为每个顶层生成一个目录结构 命名空间。也可以自动压缩生成的 如果在google appengine中使用,则特别有用的目录 环境。Recipies路径选项中填充了创建的路径 所以它可以被其他构建部分引用 使用配方。
>>> import os >>> lovely_recipy_loc = os.path.dirname(os.path.dirname(os.path.dirname( ... os.path.dirname(os.path.dirname(__file__)))))>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... develop = %(loc)s ... parts = packages ... find-links = %(server)s ... index = %(server)s/index ... ... [packages] ... recipe = lovely.recipe:eggbox ... eggs = demo ... lovely.recipe ... interpreter = py ... """ % dict(loc=lovely_recipy_loc, server=link_server))>>> print system(buildout) Develop: '...lovely.recipe' Getting distribution for 'demo'. Got demo 0.4c1. Getting distribution for 'demoneeded'. Got demoneeded 1.2c1. Installing packages. Generated script '...sample-buildout/bin/demo'. Generated interpreter '...sample-buildout/bin/py'.
现在每个顶级目录都有一个zip文件。请注意 zip文件以.egg结尾,以实现pkg_资源的兼容性。
>>> ls(sample_buildout + '/parts/packages') - easy_install.py.egg - eggrecipedemo.py.egg - eggrecipedemoneeded.py.egg - lovely.egg - pkg_resources.py.egg - setuptools.egg - zc.egg
生成的解释器现在在路径中有demo zip文件。
>>> cat(sample_buildout + '/bin/py') #!... sys.path[0:0] = [ '/sample-buildout/parts/packages/easy_install.py.egg', '/sample-buildout/parts/packages/eggrecipedemo.py.egg', '/sample-buildout/parts/packages/eggrecipedemoneeded.py.egg', '/sample-buildout/parts/packages/lovely.egg', '/sample-buildout/parts/packages/pkg_resources.py.egg', '/sample-buildout/parts/packages/setuptools.egg', '/sample-buildout/parts/packages/zc.egg', ]...
可以禁用拉链。也排除或包括 文件模式。例如,我们可以去掉 设置工具鸡蛋。我们也可以创建一个脚本。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... develop = %(loc)s ... parts = packages test ... find-links = %(server)s ... index = %(server)s/index ... ... [packages] ... zip = False ... recipe = lovely.recipe:eggbox ... eggs = demo ... lovely.recipe ... excludes = ^setuptools/.* ... ^easy_install.* ... ^pkg_resources.* ... ... [test] ... recipe = zc.recipe.egg:scripts ... eggs = lovely.recipe ... extra-paths = ${packages:path} ... interpreter = py ... """ % dict(loc=lovely_recipy_loc, server=link_server)) >>> print system(buildout), Develop: '/Users/bd/sandbox/lovely.recipe' Uninstalling packages. Installing packages. Generated script '/sample-buildout/bin/demo'. Installing test. Generated interpreter '/sample-buildout/bin/py'.
请注意,我们的目录结构仍然与压缩的 版本,每个顶级命名空间都有一个目录。“可爱的” 目录不在包目录中,因为它是一个开发鸡蛋 我们将zipped设置为false,因此它只添加到 python路径。
>>> ls(sample_buildout + '/parts/packages') d eggrecipedemo.py d eggrecipedemoneeded.py d zc>>> print system(join(sample_buildout, 'bin', 'py') + \ ... ' -c "import lovely.recipe; print lovely.recipe.__file__"') /.../src/lovely/recipe/__init__.py...
测试部分使用包部分的路径。注意,due, 到可爱的发展道路。配方这条路其实是 包含两次,因为脚本配方不检查重复项。
>>> cat(sample_buildout + '/bin/py') #!... sys.path[0:0] = [ '/...lovely.recipe/src', ... '/.../lovely.recipe/src', '/sample-buildout/parts/packages/eggrecipedemo.py', '/sample-buildout/parts/packages/eggrecipedemoneeded.py', '/sample-buildout/parts/packages/zc', ]...
I18N刀具配方
这个配方允许创建i18n工具来提取和合并po文件。
创建工具
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = i18n ... index = http://download.zope.org/zope3.4 ... offline = true ... ... [i18n] ... recipe = lovely.recipe:i18n ... package = lovely.recipe ... domain = recipe ... location = src/somewhere ... output = locales ... maker = z3c.csvvocabulary.csvStrings ... """) >>> print system(buildout), Installing i18n. i18n: setting up i18n tools Generated script 'bin/i18nextract'. Generated script 'bin/i18nmergeall'. Generated script 'bin/i18nstats'.>>> import os >>> ls(os.path.join(sample_buildout, 'bin')) - buildout - i18nextract - i18nmergeall - i18nstats
i18n提取器
>>> cat('bin', 'i18nextract') #!... <BLANKLINE> import sys sys.path[0:0] = [ ... ] <BLANKLINE> import lovely.recipe.i18n.i18nextract <BLANKLINE> if __name__ == '__main__': lovely.recipe.i18n.i18nextract.main(['i18nextract', '-d', 'recipe', '-s', '/sample-buildout/parts/i18n/configure.zcml', '-p', 'src/somewhere', '-o', 'locales', '-m', 'z3c.csvvocabulary.csvStrings'])
我们已经创建了configure.zcml。
>>> cat('parts', 'i18n', 'configure.zcml') <configure xmlns='http://namespaces.zope.org/zope'> <include package="lovely.recipe" /> </configure>
i18n合并
>>> cat('bin', 'i18nmergeall')
#!...
<BLANKLINE>
import sys
sys.path[0:0] = [
...
]
<BLANKLINE>
import lovely.recipe.i18n.i18nmergeall
<BLANKLINE>
if __name__ == '__main__':
lovely.recipe.i18n.i18nmergeall.main(['i18nmergeall', '-l', 'src/somewhere/locales'])
>>> cat('bin', 'i18nmergeall') #!... <BLANKLINE> import sys sys.path[0:0] = [ ... ] <BLANKLINE> import lovely.recipe.i18n.i18nmergeall <BLANKLINE> if __name__ == '__main__': lovely.recipe.i18n.i18nmergeall.main(['i18nmergeall', '-l', 'src/somewhere/locales'])
i18n状态
>>> cat('bin', 'i18nstats')
#!...
<BLANKLINE>
import sys
sys.path[0:0] = [
...
]
<BLANKLINE>
import lovely.recipe.i18n.i18nstats
<BLANKLINE>
if __name__ == '__main__':
lovely.recipe.i18n.i18nstats.main(['i18nstats', '-l', 'src/somewhere/locales'])
>>> cat('bin', 'i18nstats') #!... <BLANKLINE> import sys sys.path[0:0] = [ ... ] <BLANKLINE> import lovely.recipe.i18n.i18nstats <BLANKLINE> if __name__ == '__main__': lovely.recipe.i18n.i18nstats.main(['i18nstats', '-l', 'src/somewhere/locales'])
刀具名称
创建的工具以节名称命名。如果 配方名为“translation”,然后工具名为“translationextract” 和“translationmergeall”。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... index = http://download.zope.org/zope3.4 ... parts = translation ... ... offline = true ... ... [translation] ... recipe = lovely.recipe:i18n ... package = lovely.recipe ... domain = recipe ... location = src/somewhere ... output = locales ... maker = z3c.csvvocabulary.csvStrings ... """) >>> print system(buildout), Uninstalling i18n. Installing translation. translation: setting up i18n tools Generated script 'bin/translationextract'. Generated script 'bin/translationmergeall'. Generated script 'bin/translationstats'.
添加自定义configure.zcml
创建的configure.zcml包含包,并假设包 包含configure.zcml。如果不是这样,或者如果是附加包 需要include,然后可以使用zcml参数定义内容 生成的configure.zcml。
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = i18n ... ... offline = true ... ... [i18n] ... recipe = lovely.recipe:i18n ... package = lovely.recipe ... domain = recipe ... location = src/somewhere ... output = locales ... maker = z3c.csvvocabulary.csvStrings ... zcml = ... <include package='zope.component' file='meta.zcml' /> ... <include package='lovely.recipe' /> ... ... """)>>> print system(buildout), Uninstalling translation. Installing i18n. i18n: setting up i18n tools Generated script 'bin/i18nextract'. Generated script 'bin/i18nmergeall'. Generated script 'bin/i18nstats'.>>> cat('bin', 'i18nextract') #!... <BLANKLINE> import sys sys.path[0:0] = [ ... ] <BLANKLINE> import lovely.recipe.i18n.i18nextract <BLANKLINE> if __name__ == '__main__': lovely.recipe.i18n.i18nextract.main(['i18nextract', '-d', 'recipe', '-s', '/sample-buildout/parts/i18n/configure.zcml', '-p', 'src/somewhere', '-o', 'locales', '-m', 'z3c.csvvocabulary.csvStrings'])
生成的configure zcml包含我们的额外代码。
>>> cat('parts', 'i18n', 'configure.zcml') <configure xmlns='http://namespaces.zope.org/zope' xmlns:meta="http://namespaces.zope.org/meta" > <BLANKLINE> <BLANKLINE> <include package='zope.component' file='meta.zcml' /> <include package='lovely.recipe' /> <BLANKLINE> </configure>
importchecker配方
此配方在bin目录中创建importchecker实例。
创建脚本
>>> write(sample_buildout, 'buildout.cfg', ... """ ... [buildout] ... parts = checker ... ... offline = true ... ... [checker] ... recipe = lovely.recipe:importchecker ... path = src/lovely ... """) >>> print system(buildout), Installing checker. checker: setting up importchecker Generated script 'bin/importchecker'.>>> import os >>> ls(os.path.join(sample_buildout, 'bin')) - buildout - importchecker>>> cat('bin', 'importchecker') #!... <BLANKLINE> import sys sys.path[0:0] = [ ... ] <BLANKLINE> import lovely.recipe.importchecker.importchecker <BLANKLINE> if __name__ == '__main__': lovely.recipe.importchecker.importchecker.main(['importchecker', 'src/lovely'])