封装免费软件许可证的库
license的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-指向许可证说明或网站的链接
mit.python'License :: OSI Approved :: MIT License'
许可证类还提供一个静态方法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()查找与特定表达式匹配的许可证。 如果许可证是 应该在结果中:
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 程序员。