封装自由软件许可证的库
license-win的Python项目详细描述
license是一个Python库,它提供了一些关于公共自由软件许可的元数据,比如 GNU GPL,麻省理工学院等。它与python3.3+和传统python2.7兼容。在
基本用途
要获得许可证,可以使用SPDX license identifier:
importlicensemit=license.find('MIT')
每个许可证都是一个静态类,提供了一些属性:
- id-SPDX标识符
- name-许可证的可读名称
- rpm-license identifier used in Fedora, RHEL and CentOS RPMs
- python-PyPI classifier
- url-指向许可证说明或网站的链接
许可证类还提供一个静态方法render(),它将输出整个许可证文本。 有些变量必须传递给它,通常是name、email和可选的year (省略时使用当年)。在
mit.render(name='Petr Foo',email='petr@foo.org')'''The MIT License (MIT) Copyright (c) 2015 Petr Foo <petr@foo.org> Permission is hereby granted... (snip)'''
有些许可证(例如来自GPL家族的许可证)也有一个标题文本,这是应该的 添加到每个源文件。header()用于呈现该文件,但是请小心,如果许可证这样做的话 不使用特殊头,AttributeError上升。在
mit.header(name='Petr Foo',email='petr@foo.org')AttributeError:TheMITlicenseusesnoheader
如果要按其他密钥搜索许可证,可以:
bsd=license.find_by_key('rpm','BSD')bsd[license.licenses.BSD3ClauseLicense,license.licenses.BSD2ClauseLicense]
bsd现在是一个列表,因为与SPDX标识符不同,其他键可能并不总是唯一的。如果 您只需要具有此类标识符的第一个许可证,就可以将multiple=False传递给 find_by_key():
bsd=license.find_by_key('rpm','BSD',multiple=False)bsdlicense.licenses.BSD3ClauseLicense
如果没有找到这样的许可证,您将得到KeyError,与常规的find()相同。在
如果您想按某个键执行大量搜索,您可以构建和索引 应该(理论上)加快搜索速度(没有进行任何测量)。在
license.build_index('rpm')
如果要删除索引,请使用license.delete_index(key)。打电话是安全的 即使索引不存在。在
还可以使用find_by_function()查找与特定表达式匹配的许可证。 函数应该接受一个参数(license类),如果许可证是 应该在结果中:
osi=license.find_by_function(lambdal:l.python.startswith('License :: OSI Approved :: '))
同样,它返回一个列表并有multiple参数来更改它。在
如果一个简单的函数还不够,您可以使用 license.iter():
forclsinlicense.iter():# do something
添加许可证
当前的许可证列表没有太多的内容,所以您最喜欢的许可证可能不在 在那里。如果要更改,请将许可证添加到license/licenses.py,并将模板添加到 license/templates,然后发送一个pull request on GitHub。请参阅当前的许可证以了解如何执行此操作。 许可证类别如下所示:
classAGPLv3LaterLicense(license.base.License):''' GNU Affero General Public License v3.0 or later '''id='AGPL-3.0+'rpm='AGPLv3+'python='License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)'url='http://www.gnu.org/licenses/agpl-3.0.html'
一个许可证可以从另一个许可证继承而忽略相等的密钥。注意docstring是 重要,它被用作name属性。许可证模板名为id,头模板 以__header后缀命名。在
如果希望在代码中添加自定义许可证,也可以这样做。如果你不使用 render()或header(),事情很简单。只要在任何地方定义这样的类并调用 license.register()。在
但是,如果您随后调用render()或header(),那么该模板将不存在 找到了。在这种情况下,您必须使用jinja2模板加载器创建自定义基本许可证。在
CustomBaseLicense=license.base.custom_license_base_class(loader=jinja2.FileSystemLoader('path/to/templates'))classCustomLicense(CustomBaseLicense):...license.register(CustomLicense)
loader可以是任何有效的jinja2 loader。 如果希望一次注册多个类,可以使用license.autoregister(),它将 注册给定模块中存在的所有类。你不会想注册你的 CustomBaseLicense,因此您将在ignore参数中传递它。在
license.autoregister(sys.modules[__name__],ignore=[CustomBaseLicense])
请注意,如果添加自定义许可证并使用license.build_index(),则需要构建索引 注册之后。多次调用build_index()是安全的。在
(可能)常见问题
为什么许可证被表示为子类而不是License的实例?
这样,就更容易在多个许可证之间继承数据。类的定义是 更易于维护和可读。在
license不是保留名称吗?
是的,它打印Python的许可证。可能是你只会在互动中使用的东西 Python控制台。通过导入此库,您将重写它。我们可以给图书馆命名 使用一些很酷和独特的东西,比如licenraptor,但是我们想让这个名字简单到 可能。如果您不喜欢这样,您可以始终执行import license as somethignelse。在
不是已经有Python工具可以呈现许可证文本吗?
是的,是的。但是它们都是命令行实用程序,没有为Python提供API 程序员。在
- 项目
标签: