封装免费软件许可证的库

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中如何读取坐标的奇偶行?   java如何为JPAHibernate定义非JTA数据源?组织。冬眠联系数据源连接提供程序找不到数据源:   java Eclipse将JavaFX包标记为缺失,尽管它们已添加到构建路径中   java格式化toString方法   java如何在启动程序时将光标集中在JTextField上?   java如何修复NoTouchElementException扫描程序?   在java中,从异常块调用方法是一种好的做法吗?   jsp Java对象创建与字符串解析   java缺失。将jfrog工件从3.4.1升级到4.7后,jar工件的pom文件   JavaAndroidStudio:在重新格式化代码时,将我的单行方法保留为键入的方法   安卓如何在java中访问嵌套的Json数组数据   弹性搜索中的java模式匹配?   java小部件在应用程序被强制停止后无法正常启动   java VideoView添加多个视频并播放   java Maven+FindBugs在高优先级警告时失败   java更新:根据文件扩展名将文件从一个文件夹移动到另一个文件夹   java从mysql表获取元素到arraylist   java在Android studio中使用npm jsonserver