Unidiff
=======
Simple Python library to parse and interact with unified diff data.
.. image:: https://www.travis-ci.com/matiasb/python-unidiff.svg?branch=master
:target: https://travis-ci.com/matiasb/python-unidiff
Installing unidiff
------------------
::
$ pip install unidiff
Quick start
-----------
::
>>> 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'^([- \+\\])')
-
Load unified diff data by instantiating :code:`PatchSet` with a file-like object as
argument, or using :code:`PatchSet.from_filename` class method to read diff from file.
A :code:`PatchSet` is a list of files updated by the given patch. For each :code:`PatchedFile`
you can get stats (if it is a new, removed or modified file; the source/target
lines; etc), besides having access to each hunk (also like a list) and its
respective info.
At any point you can get the string representation of the current object, and
that will return the unified diff data of it.
As a quick example of what can be done, check bin/unidiff file.
Also, once installed, unidiff provides a command-line program that displays
information from diff data (a file, or stdin). For example:
::
$ 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)
Load a local diff file
----------------------
To instantiate :code:`PatchSet` from a local file, you can use:
::
>>> 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>]>
Notice the (optional) :code:`encoding` parameter. If not specified, unicode input will be expected. Or alternatively:
::
>>> 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>]>
Finally, you can also instantiate :code:`PatchSet` passing any iterable (and encoding, if needed):
::
>>> 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>]>
If you don't need to be able to rebuild the original unified diff input, you can pass
:code:`metadata_only=True` (defaults to :code:`False`), which should help making the
parsing more efficient:
::
>>> from unidiff import PatchSet
>>> patch = PatchSet.from_filename('tests/samples/bzr.diff', encoding='utf-8', metadata_only=True)
References
----------
* http://en.wikipedia.org/wiki/Diff_utility
* http://www.artima.com/weblogs/viewpost.jsp?thread=164293
Raw data
{
"_id": null,
"home_page": "http://github.com/matiasb/python-unidiff",
"name": "unidiff",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "unified,diff,parse,metadata",
"author": "Matias Bordese",
"author_email": "mbordese@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/be/69/aa7dc315290382a52e7441c61c987b801434078b1c07bd9a7b377206ae82/unidiff-0.7.4.tar.gz",
"platform": null,
"description": "Unidiff\n=======\n\nSimple Python library to parse and interact with unified diff data.\n\n.. image:: https://www.travis-ci.com/matiasb/python-unidiff.svg?branch=master\n :target: https://travis-ci.com/matiasb/python-unidiff\n\nInstalling unidiff\n------------------\n\n::\n\n $ pip install unidiff\n\n\nQuick start\n-----------\n\n::\n\n >>> import urllib.request\n >>> from unidiff import PatchSet\n >>> diff = urllib.request.urlopen('https://github.com/matiasb/python-unidiff/pull/3.diff')\n >>> encoding = diff.headers.get_charsets()[0]\n >>> patch = PatchSet(diff, encoding=encoding)\n >>> patch\n <PatchSet: [<PatchedFile: .gitignore>, <PatchedFile: unidiff/patch.py>, <PatchedFile: unidiff/utils.py>]>\n >>> patch[0]\n <PatchedFile: .gitignore>\n >>> patch[0].is_added_file\n True\n >>> patch[0].added\n 6\n >>> patch[1]\n <PatchedFile: unidiff/patch.py>\n >>> patch[1].added, patch[1].removed\n (20, 11)\n >>> len(patch[1])\n 6\n >>> patch[1][2]\n <Hunk: @@ 109,14 110,21 @@ def __repr__(self):>\n >>> patch[2]\n <PatchedFile: unidiff/utils.py>\n >>> print(patch[2])\n diff --git a/unidiff/utils.py b/unidiff/utils.py\n index eae63e6..29c896a 100644\n --- a/unidiff/utils.py\n +++ b/unidiff/utils.py\n @@ -37,4 +37,3 @@\n # - deleted line\n # \\ No newline case (ignore)\n RE_HUNK_BODY_LINE = re.compile(r'^([- \\+\\\\])')\n -\n\n\nLoad unified diff data by instantiating :code:`PatchSet` with a file-like object as\nargument, or using :code:`PatchSet.from_filename` class method to read diff from file.\n\nA :code:`PatchSet` is a list of files updated by the given patch. For each :code:`PatchedFile`\nyou can get stats (if it is a new, removed or modified file; the source/target\nlines; etc), besides having access to each hunk (also like a list) and its\nrespective info.\n\nAt any point you can get the string representation of the current object, and\nthat will return the unified diff data of it.\n\nAs a quick example of what can be done, check bin/unidiff file.\n\nAlso, once installed, unidiff provides a command-line program that displays\ninformation from diff data (a file, or stdin). For example:\n\n::\n\n $ git diff | unidiff\n Summary\n -------\n README.md: +6 additions, -0 deletions\n\n 1 modified file(s), 0 added file(s), 0 removed file(s)\n Total: 6 addition(s), 0 deletion(s)\n\n\nLoad a local diff file\n----------------------\n\nTo instantiate :code:`PatchSet` from a local file, you can use:\n\n::\n\n >>> from unidiff import PatchSet\n >>> patch = PatchSet.from_filename('tests/samples/bzr.diff', encoding='utf-8')\n >>> patch\n <PatchSet: [<PatchedFile: added_file>, <PatchedFile: modified_file>, <PatchedFile: removed_file>]>\n\nNotice the (optional) :code:`encoding` parameter. If not specified, unicode input will be expected. Or alternatively:\n\n::\n\n >>> import codecs\n >>> from unidiff import PatchSet\n >>> with codecs.open('tests/samples/bzr.diff', 'r', encoding='utf-8') as diff:\n ... patch = PatchSet(diff)\n ...\n >>> patch\n <PatchSet: [<PatchedFile: added_file>, <PatchedFile: modified_file>, <PatchedFile: removed_file>]>\n\nFinally, you can also instantiate :code:`PatchSet` passing any iterable (and encoding, if needed):\n\n::\n\n >>> from unidiff import PatchSet\n >>> with open('tests/samples/bzr.diff', 'r') as diff:\n ... data = diff.readlines()\n ...\n >>> patch = PatchSet(data)\n >>> patch\n <PatchSet: [<PatchedFile: added_file>, <PatchedFile: modified_file>, <PatchedFile: removed_file>]>\n\nIf you don't need to be able to rebuild the original unified diff input, you can pass\n:code:`metadata_only=True` (defaults to :code:`False`), which should help making the\nparsing more efficient:\n\n::\n\n >>> from unidiff import PatchSet\n >>> patch = PatchSet.from_filename('tests/samples/bzr.diff', encoding='utf-8', metadata_only=True)\n\n\nReferences\n----------\n\n* http://en.wikipedia.org/wiki/Diff_utility\n* http://www.artima.com/weblogs/viewpost.jsp?thread=164293\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Unified diff parsing/metadata extraction library.",
"version": "0.7.4",
"split_keywords": [
"unified",
"diff",
"parse",
"metadata"
],
"urls": [
{
"comment_text": "",
"digests": {
"md5": "4871095891d693b0addfadde2c8286fe",
"sha256": "688622add422f84a873498cc4ff9bf50da5ea6c23dea908f19d2190fa39a8e39"
},
"downloads": -1,
"filename": "unidiff-0.7.4-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "4871095891d693b0addfadde2c8286fe",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 14323,
"upload_time": "2022-06-26T20:13:49",
"upload_time_iso_8601": "2022-06-26T20:13:49.544897Z",
"url": "https://files.pythonhosted.org/packages/48/00/e695b11d408c991ad57df971814bd8954eea6ae74147568d8e808115ddb9/unidiff-0.7.4-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"md5": "9a4108b151fff5db4e1ae280ed18835a",
"sha256": "2bbcbc986e1fb97f04b1d7b864aa6002ab02f4d8a996bf03aa6e5a81447d1fc5"
},
"downloads": -1,
"filename": "unidiff-0.7.4.tar.gz",
"has_sig": false,
"md5_digest": "9a4108b151fff5db4e1ae280ed18835a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 16430,
"upload_time": "2022-06-26T20:13:52",
"upload_time_iso_8601": "2022-06-26T20:13:52.941071Z",
"url": "https://files.pythonhosted.org/packages/be/69/aa7dc315290382a52e7441c61c987b801434078b1c07bd9a7b377206ae82/unidiff-0.7.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2022-06-26 20:13:52",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "matiasb",
"github_project": "python-unidiff",
"travis_ci": true,
"coveralls": false,
"github_actions": false,
"lcname": "unidiff"
}