跳转到主要内容

统一差异解析/元数据提取库。

项目描述

一个简单的Python库,用于解析和交互统一差异数据。

https://travis-ci.cn/matiasb/python-unidiff.svg?branch=master

安装unidiff

$ pip install unidiff

快速开始

>>> import urllib.request
>>> from unidiff import PatchSet
>>> diff = urllib.request.urlopen('https://github.com/matiasb/python-unidiff/pull/3.diff')
>>> encoding = diff.headers.get_charsets()[0]
>>> patch = PatchSet(diff, encoding=encoding)
>>> patch
<PatchSet: [<PatchedFile: .gitignore>, <PatchedFile: unidiff/patch.py>, <PatchedFile: unidiff/utils.py>]>
>>> patch[0]
<PatchedFile: .gitignore>
>>> patch[0].is_added_file
True
>>> patch[0].added
6
>>> patch[1]
<PatchedFile: unidiff/patch.py>
>>> patch[1].added, patch[1].removed
(20, 11)
>>> len(patch[1])
6
>>> patch[1][2]
<Hunk: @@ 109,14 110,21 @@ def __repr__(self):>
>>> patch[2]
<PatchedFile: unidiff/utils.py>
>>> print(patch[2])
diff --git a/unidiff/utils.py b/unidiff/utils.py
index eae63e6..29c896a 100644
--- a/unidiff/utils.py
+++ b/unidiff/utils.py
@@ -37,4 +37,3 @@
# - deleted line
# \ No newline case (ignore)
RE_HUNK_BODY_LINE = re.compile(r'^([- \+\\])')
-

通过将文件对象作为参数传递给PatchSet或使用PatchSet.from_filename类方法从文件中读取差异来加载统一差异数据。

PatchSet是给定补丁更新的文件的列表。对于每个PatchedFile,您可以获取统计信息(如果是新文件、已删除或已修改的文件;源/目标行等),此外还可以访问每个块(也像列表一样)及其相关信息。

在任何时候,您都可以获取当前对象的字符串表示形式,这将返回该对象的一致差异数据。

作为一个快速示例,请查看bin/unidiff文件。

此外,一旦安装,unidiff提供了一个命令行程序,可以显示差异数据(文件或stdin)的信息。例如

$ git diff | unidiff
Summary
-------
README.md: +6 additions, -0 deletions

1 modified file(s), 0 added file(s), 0 removed file(s)
Total: 6 addition(s), 0 deletion(s)

加载本地差异文件

要从本地文件实例化PatchSet,您可以使用

>>> from unidiff import PatchSet
>>> patch = PatchSet.from_filename('tests/samples/bzr.diff', encoding='utf-8')
>>> patch
<PatchSet: [<PatchedFile: added_file>, <PatchedFile: modified_file>, <PatchedFile: removed_file>]>

注意(可选的)encoding参数。如果没有指定,则期望unicode输入。或者,作为替代方案

>>> import codecs
>>> from unidiff import PatchSet
>>> with codecs.open('tests/samples/bzr.diff', 'r', encoding='utf-8') as diff:
...     patch = PatchSet(diff)
...
>>> patch
<PatchSet: [<PatchedFile: added_file>, <PatchedFile: modified_file>, <PatchedFile: removed_file>]>

最后,您还可以传递任何可迭代对象(如果需要,则传递编码)来实例化PatchSet

>>> from unidiff import PatchSet
>>> with open('tests/samples/bzr.diff', 'r') as diff:
...     data = diff.readlines()
...
>>> patch = PatchSet(data)
>>> patch
<PatchSet: [<PatchedFile: added_file>, <PatchedFile: modified_file>, <PatchedFile: removed_file>]>

如果您不需要能够重新构建原始统一差异输入,可以传递metadata_only=True(默认为False),这将有助于提高解析效率

>>> from unidiff import PatchSet
>>> patch = PatchSet.from_filename('tests/samples/bzr.diff', encoding='utf-8', metadata_only=True)

参考

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

unidiff-0.7.5.tar.gz (20.9 kB 查看哈希值)

上传时间 源代码

构建分布

unidiff-0.7.5-py2.py3-none-any.whl (14.4 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下提供支持