封装自由软件许可证的库

license-win的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')

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

^{pr2}$

许可证类还提供一个静态方法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()查找与特定表达式匹配的许可证。 函数应该接受一个参数(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 程序员。在

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

推荐PyPI第三方库


热门话题
利用SWAP函数解决互斥的同步Java死锁   主线程退出时程序的java终止?   java Firestore字段空类型用法   java Android在同一页面上滚动到ID   java Eclipse:将源代码文件夹导入其他项目   maven Groovy编译以“java”结尾。StackOverflowerr语言`   java从变量中获取变量列表   java在Eclipse中重命名标识符时输入vs转义   Java:创建一个只包含重复项的数组   java Mule ESB 3.3 Mulecontext注册表pop   bash杀戮屏幕但java进程未结束   java正在创建一个表来存储一行错误编程的迹象?   java如何启动RecentApplicationDialog?   java以确定的增量移动字符串中的字符   使用用户输入搜索多个mysql数据库的JavaJSP算法   java Arraylist到DefaultComboxModel