跳转到主要内容

无需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 (18.8 kB 查看哈希值)

上传时间 源代码

支持者