封装免费软件许可证的库

license的Python项目详细描述


https://badge.fury.io/py/license.svghttp://img.shields.io/:license-mit-green.svg?style=flathttps://travis-ci.org/hroncok/license.png?branch=master

license是一个python库,它提供一些关于公共自由软件许可的元数据,例如 GNU GPL、麻省理工学院等。它与Python3.3+和旧式Python2.7兼容。

基本用法

要获得许可证,您可以使用SPDX license identifier

importlicensemit=license.find('MIT')

每个许可证都是一个静态类,提供一些属性:

mit.python'License :: OSI Approved :: MIT License'

许可证类还提供一个静态方法render(),该方法将输出整个许可证文本。 一些变量必须传递给它,通常是nameemail和可选的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 程序员。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java线程执行器服务   aspose如何通过java获得单词bookmark之前的所有文本内容?   一对一映射的java Hibernate合并问题   java SOAP XSD根元素问题   java如何保护我的Spring启动API   java使用GeoJson向google地图添加标记   java安卓:在SQLite中没有这样的列   java STS 2.8.0 StartExplorer/Legacy插件安装问题   java如何以编程方式获取AppBar高度?   在Java中将BigDecimal添加到BigDecimal   java不支持ntdll。dll是windows xp和windows vista的标准配置吗?   内容类型为application/xwwwformurlencoded的java Http Put请求在Spring中不起作用   java在数组中计算工资并返回答案   java数字/货币格式   elasticsearch java api中的弹性搜索查询