无需setuptools即可打包为egg的工具
项目描述
Python Egg Layer
此包提供用于动态构建Python包的Python类。为什么不用setuptools?因为我们需要从Django视图动态生成egg,而不是生成临时文件。为什么要在地球上动态生成Python包?政策最好通过GenericSetup注入到Plone中。但许多政策依赖于Buildout或其他部署系统中的设置。简单的Python egg很容易生成,所以我们决定看看从我们的配置管理工具生成策略egg的效果如何。
功能
- 自动命名空间
如果您的包名为foo.bar.baz,则foo/__init__.py和foo/bar/__init__.py将自动包含用于命名空间的pkg_resources魔法,而setup.py将定义所有命名空间包。
- 自动z3c.autoinclude
如果您构建一个Plone包,它将自动使用z3c.autoinclude向Plone进行宣传。
你好,世界!
在开始构建egg之前,我们需要三样东西:包名、版本和一个可写入的文件对象。这可以是StringIO、文件或甚至Django HTTPResponse
from isotoma.egglayer import Package p = Package(open("test.zip", "w"), "test.package", "1.0")
您不需要担心目录。您只需添加文件
p.add("test/package/__init__.py", "print 'Hello, world!'")
您添加的任何文件都会被跟踪,以确保egg的SOURCES.txt文件正确。
当您完成向包中添加内容后,请调用close()方法。这将生成egg-info目录和setup.py文件。
p.close()
如果您不这样做,Python将自动在__del__期间调用close()。
从Django动态生成包
我们可以这样设置一个新的视图子类
from django.views.generic import View from django.http import HttpResponse from django import template from isotoma.egglayer import Package class MyCustomizedEgg(View): def get(self, request, *args, **kwargs): response = HttpResponse(content_type="application/zip") response['Cache-Control'] = 'no-cache' response['Content-Disposition'] = 'filename=test.customegg-1.0.zip' p = Package(response, 'test.customegg', '1.0') p.add("test/customegg/foo.py", "print "hello world") p.close() return response
由于HttpResonse是一个类似于文件的对象,我们可以直接将其作为Package对象的输出。您可以将Cache-Control头设置为在测试时停止缓存egg,但您的最终代码不应需要它。Content-Disposition头允许您的浏览器在保存动态生成的包时建议一个合理的文件名。如果您使用pip或buildout等工具使用此视图,它可能或可能不关心此头。
(显然您需要将其连接到urls.py中 - 请参阅Django文档了解如何操作)。
变更日志
0.0.5 (2012-01-31)
字符串是可迭代的。哎呀,Python/Jinja2真糟糕。
0.0.4 (2012-01-31)
添加创建properties.xml文件的辅助函数。
0.0.3 (2011-12-21)
在configure.zcml中将plone xmlns默认设置为可用
0.0.2 (2011-12-14)
添加生成propertiestool.xml的辅助函数
p = Profile("default") p.propertiestool.set("site_properties", "someproperty", "somevalue") pkg.add_profile(p)
添加在registry.xml中生成记录的辅助函数
p = Profile("default") p.registry.set("plone.app.theming.interfaces.IThemeSettings.hostnameBlacklist", ["localhost"]) pkg.add_profile(p)
0.0.1 (2011-12-14)
一些基本抽象,以帮助生成Plone GenericSetup配置文件
p = Profile("default") p.dependencies.extend([ "my.other.egg:default", ]) pkg.add_profile(p)
可以注入原始zcml到configure.zcml中
pkg.zcml_stanza.apend('<i18n:registerTranslations directory="locales"/>')
__init__.py将自动为您项目中的根非命名空间文件夹创建。对于Plone项目,它将有一个no-op initialize(),该initialize()由configure.zcml引用。
0.0.0 (2011-12-09)
初始版本。
项目详情
isotoma.egglayer-0.0.5.zip的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 478aac232b1b07fa1fe12962e2cb75858f9723b631eaf8927fc7cce28f726e86 |
|
MD5 | 15f56fcd593c1cb3d1d3607adf554ec2 |
|
BLAKE2b-256 | 82a1ecc85d286b0b522b7ed98344bd8919988d44a48a23d4e4b9311426c1929c |