unidiff


Nameunidiff JSON
Version 0.7.4 PyPI version JSON
download
home_pagehttp://github.com/matiasb/python-unidiff
SummaryUnified diff parsing/metadata extraction library.
upload_time2022-06-26 20:13:52
maintainer
docs_urlNone
authorMatias Bordese
requires_python
licenseMIT
keywords unified diff parse metadata
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI
coveralls test coverage No coveralls.
            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"
}
        
Elapsed time: 0.01237s