git: 4ed2bd37b021 - main - textproc/py-whatthepatch: New port: For patch files

From: Rainer Hurling <rhurlin_at_FreeBSD.org>
Date: Tue, 12 Jul 2022 17:07:23 UTC
The branch main has been updated by rhurlin:

URL: https://cgit.FreeBSD.org/ports/commit/?id=4ed2bd37b0219eacf261cd82f44dad7bc18c005d

commit 4ed2bd37b0219eacf261cd82f44dad7bc18c005d
Author:     Rainer Hurling <rhurlin@FreeBSD.org>
AuthorDate: 2022-07-12 16:52:49 +0000
Commit:     Rainer Hurling <rhurlin@FreeBSD.org>
CommitDate: 2022-07-12 17:06:48 +0000

    textproc/py-whatthepatch: New port: For patch files
    
    Library for both parsing and applying patch files
    
    Features:
    - Parsing of almost all diff formats (except forwarded ed)
      - normal (default, --normal)
      - copied context (-c, --context)
      - unified context (-u, --unified)
      - ed script (-e, --ed)
      - rcs ed script (-n, --rcs)
    - Parsing of several SCM patches
      - CVS
      - SVN
      - Git
    
    https://github.com/cscorley/whatthepatch
    
    This port is needed for the next update of textproc/py-python-lsp-server.
    
    The patches in files are post-release additions from Github:
    - #4b0d9ef70109 Fix unified diff parse error
    - #700175dd2bf7 Support Python 3.9
---
 textproc/Makefile                                  |   1 +
 textproc/py-whatthepatch/Makefile                  |  19 +
 textproc/py-whatthepatch/distinfo                  |   3 +
 .../files/0001-Fix-unified-diff-parse-error.patch  | 144 +++++
 ...-support-3.9-on-build-and-cut-new-version.patch | 580 +++++++++++++++++++++
 textproc/py-whatthepatch/pkg-descr                 |  13 +
 6 files changed, 760 insertions(+)

diff --git a/textproc/Makefile b/textproc/Makefile
index 68134eb9aeee..aafed562a018 100644
--- a/textproc/Makefile
+++ b/textproc/Makefile
@@ -1549,6 +1549,7 @@
     SUBDIR += py-ucl
     SUBDIR += py-ufal.udpipe
     SUBDIR += py-wcmatch
+    SUBDIR += py-whatthepatch
     SUBDIR += py-whoosh
     SUBDIR += py-wordcloud
     SUBDIR += py-wordnet
diff --git a/textproc/py-whatthepatch/Makefile b/textproc/py-whatthepatch/Makefile
new file mode 100644
index 000000000000..7d2d737bff8c
--- /dev/null
+++ b/textproc/py-whatthepatch/Makefile
@@ -0,0 +1,19 @@
+PORTNAME=	whatthepatch
+PORTVERSION=	1.0.2
+CATEGORIES=	textproc python
+MASTER_SITES=	CHEESESHOP
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER=	rhurlin@FreeBSD.org
+COMMENT=	Library for both parsing and applying patch files
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+# make test: 1 failed, 48 passed
+USES=		python:3.7+ pytest
+USE_PYTHON=	concurrent distutils autoplist
+
+NO_ARCH=	yes
+
+.include <bsd.port.mk>
diff --git a/textproc/py-whatthepatch/distinfo b/textproc/py-whatthepatch/distinfo
new file mode 100644
index 000000000000..21c05e5d690e
--- /dev/null
+++ b/textproc/py-whatthepatch/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1657565995
+SHA256 (whatthepatch-1.0.2.tar.gz) = c540ea59173e0a291e19c742dd8b406c56e2be039a600edb7c6fc3ae4bbdfa9f
+SIZE (whatthepatch-1.0.2.tar.gz) = 28459
diff --git a/textproc/py-whatthepatch/files/0001-Fix-unified-diff-parse-error.patch b/textproc/py-whatthepatch/files/0001-Fix-unified-diff-parse-error.patch
new file mode 100644
index 000000000000..670d42507289
--- /dev/null
+++ b/textproc/py-whatthepatch/files/0001-Fix-unified-diff-parse-error.patch
@@ -0,0 +1,144 @@
+From 4d6629d4617fa94ee907145c00dcb6b7852f674e Mon Sep 17 00:00:00 2001
+From: Kai Zhang <kylerzhang11@gmail.com>
+Date: Thu, 4 Feb 2021 12:01:44 +0800
+Subject: [PATCH 1/2] Fix unified diff parse error
+
+
+diff --git a/tests/casefiles/abc b/tests/casefiles/abc
+new file mode 100644
+index 0000000..5b4d7c6
+--- /dev/null
++++ b/tests/casefiles/abc
+@@ -0,0 +1 @@
++The Nameless is the origin of Heaven and Earth;
+diff --git a/tests/casefiles/diff-unified2.diff b/tests/casefiles/diff-unified2.diff
+new file mode 100644
+index 0000000..168410b
+--- /dev/null
++++ b/tests/casefiles/diff-unified2.diff
+@@ -0,0 +1,5 @@
++--- abc	2013-01-05 16:56:19.000000000 -0600
+++++ efg	2013-01-05 16:56:35.000000000 -0600
++@@ -1 +1,2 @@
++ The Nameless is the origin of Heaven and Earth;
+++The named is the mother of all things.
+diff --git a/tests/casefiles/efg b/tests/casefiles/efg
+new file mode 100644
+index 0000000..9e0843b
+--- /dev/null
++++ b/tests/casefiles/efg
+@@ -0,0 +1,2 @@
++The Nameless is the origin of Heaven and Earth;
++The named is the mother of all things.
+diff --git a/tests/test_apply.py b/tests/test_apply.py
+index 0f94d2a..38a39db 100644
+--- a/tests/test_apply.py
++++ b/tests/test_apply.py
+@@ -28,6 +28,12 @@ class ApplyTestSuite(unittest.TestCase):
+         with open("tests/casefiles/tzu") as f:
+             self.tzu = f.read().splitlines()
+ 
++        with open("tests/casefiles/abc") as f:
++            self.abc = f.read().splitlines()
++
++        with open("tests/casefiles/efg") as f:
++            self.efg = f.read().splitlines()
++
+     def test_truth(self):
+         self.assertEqual(type(self.lao), list)
+         self.assertEqual(type(self.tzu), list)
+@@ -55,6 +61,13 @@ class ApplyTestSuite(unittest.TestCase):
+         self.assertEqual(_apply(self.lao, diff_text), self.tzu)
+         self.assertEqual(_apply_r(self.tzu, diff_text), self.lao)
+ 
++    def test_diff_unified2(self):
++        with open("tests/casefiles/diff-unified2.diff") as f:
++            diff_text = f.read()
++
++        self.assertEqual(_apply(self.abc, diff_text), self.efg)
++        self.assertEqual(_apply_r(self.efg, diff_text), self.abc)
++
+     def test_diff_unified_bad(self):
+         with open("tests/casefiles/diff-unified-bad.diff") as f:
+             diff_text = f.read()
+@@ -129,6 +142,22 @@ class ApplyTestSuite(unittest.TestCase):
+         with pytest.raises(exceptions.ApplyException):
+             _apply([""] + self.lao, diff_text, use_patch=True)
+ 
++    def test_diff_unified2_patchutil(self):
++        with open("tests/casefiles/diff-unified2.diff") as f:
++            diff_text = f.read()
++
++        if not which("patch"):
++            raise SkipTest()
++
++        self.assertEqual(_apply(self.abc, diff_text, use_patch=True),
++                         (self.efg, None))
++        self.assertEqual(_apply(self.abc, diff_text, use_patch=True),
++                         (_apply(self.abc, diff_text), None))
++        self.assertEqual(_apply_r(self.efg, diff_text, use_patch=True),
++                         (self.abc, None))
++        self.assertEqual(_apply_r(self.efg, diff_text, use_patch=True),
++                         (_apply_r(self.efg, diff_text), None))
++
+     def test_diff_rcs(self):
+         with open("tests/casefiles/diff-rcs.diff") as f:
+             diff_text = f.read()
+diff --git a/tests/test_patch.py b/tests/test_patch.py
+index b50cd00..bd4b961 100644
+--- a/tests/test_patch.py
++++ b/tests/test_patch.py
+@@ -857,6 +857,34 @@ class PatchTestSuite(unittest.TestCase):
+         results_main = next(wtp.patch.parse_patch(text))
+         self.assert_diffs_equal(results_main, expected_main)
+ 
++    def test_unified2_diff(self):
++        with open(datapath("diff-unified2.diff")) as f:
++            text = f.read()
++
++        # off with your head!
++        text_diff = "\n".join(text.splitlines()[2:]) + "\n"
++
++        expected = [
++            (None, 2, "The named is the mother of all things."),
++        ]
++
++        results = list(wtp.patch.parse_unified_diff(text_diff))
++        self.assert_diffs_equal(results, expected)
++
++        expected_main = diffobj(
++            header=headerobj(
++                index_path=None,
++                old_path="abc",
++                old_version="2013-01-05 16:56:19.000000000 -0600",
++                new_path="efg",
++                new_version="2013-01-05 16:56:35.000000000 -0600",
++            ),
++            changes=expected,
++            text=text,
++        )
++        results_main = next(wtp.patch.parse_patch(text))
++        self.assert_diffs_equal(results_main, expected_main)
++
+     def test_diff_unified_with_does_not_include_extra_lines(self):
+         with open("tests/casefiles/diff-unified-blah.diff") as f:
+             text = f.read()
+diff --git a/whatthepatch/patch.py b/whatthepatch/patch.py
+index 9b592a2..3d58df6 100644
+--- a/whatthepatch/patch.py
++++ b/whatthepatch/patch.py
+@@ -622,8 +622,9 @@ def parse_unified_diff(text):
+                 elif kind == "+" and (i != new_len or i == 0):
+                     changes.append(Change(None, new + i, line, hunk_n))
+                     i += 1
+-                elif kind == " " and r != old_len and i != new_len:
+-                    changes.append(Change(old + r, new + i, line, hunk_n))
++                elif kind == " ":
++                    if r != old_len and i != new_len:
++                        changes.append(Change(old + r, new + i, line, hunk_n))
+                     r += 1
+                     i += 1
+ 
+-- 
+2.37.0
+
diff --git a/textproc/py-whatthepatch/files/0002-Update-to-support-3.9-on-build-and-cut-new-version.patch b/textproc/py-whatthepatch/files/0002-Update-to-support-3.9-on-build-and-cut-new-version.patch
new file mode 100644
index 000000000000..abcc1cf363c7
--- /dev/null
+++ b/textproc/py-whatthepatch/files/0002-Update-to-support-3.9-on-build-and-cut-new-version.patch
@@ -0,0 +1,580 @@
+From 700175dd2bf76e312d3d44f7033b9a7f84dc7aaa Mon Sep 17 00:00:00 2001
+From: "Christopher S. Corley" <chris.corley@fathom.video>
+Date: Fri, 5 Feb 2021 21:57:11 -0500
+Subject: [PATCH 2/2] Update to support 3.9 on build and cut new version
+
+
+diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
+index d9e0039..d15eee6 100644
+--- a/.github/workflows/build.yml
++++ b/.github/workflows/build.yml
+@@ -16,7 +16,7 @@ jobs:
+     strategy:
+       matrix:
+         os: [ubuntu-latest, macos-latest, windows-latest]
+-        python-version: [3.5, 3.6, 3.7, 3.8]
++        python-version: [3.5, 3.6, 3.7, 3.8, 3.9]
+ 
+     steps:
+       - uses: actions/checkout@v2
+diff --git a/HISTORY.md b/HISTORY.md
+index 0df906e..4f235f5 100644
+--- a/HISTORY.md
++++ b/HISTORY.md
+@@ -2,6 +2,11 @@
+ 
+ Nothing yet :)
+ 
++# 1.0.2
++
++- Support up to 3.9
++- PR #42 Fix unified diff parse error (Thanks, @kkpattern)
++
+ # 1.0.1
+ 
+ - PR #37 Replace nose with pytest (Thanks, @MeggyCal)
+diff --git a/Pipfile b/Pipfile
+index 606069f..5fb951e 100644
+--- a/Pipfile
++++ b/Pipfile
+@@ -15,7 +15,7 @@ wheel = "*"
+ [packages]
+ 
+ [requires]
+-python_version = "3.7"
++python_version = "3.9"
+ 
+ [pipenv]
+ allow_prereleases = true
+diff --git a/Pipfile.lock b/Pipfile.lock
+index a4bc5b6..b8ddb32 100644
+--- a/Pipfile.lock
++++ b/Pipfile.lock
+@@ -1,11 +1,11 @@
+ {
+     "_meta": {
+         "hash": {
+-            "sha256": "3a87b619c61c9c76e282c92cf216f184d3207572cb11b0b30d05fed98aaf997f"
++            "sha256": "0b974aff9c74c44e274d0d21a9d71e0d5ad85f5d4469cd75722e1aec852d4060"
+         },
+         "pipfile-spec": 6,
+         "requires": {
+-            "python_version": "3.7"
++            "python_version": "3.9"
+         },
+         "sources": [
+             {
+@@ -24,108 +24,98 @@
+             ],
+             "version": "==1.4.4"
+         },
+-        "atomicwrites": {
+-            "hashes": [
+-                "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197",
+-                "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"
+-            ],
+-            "markers": "sys_platform == 'win32'",
+-            "version": "==1.4.0"
+-        },
+         "attrs": {
+             "hashes": [
+-                "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
+-                "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
++                "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6",
++                "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"
+             ],
+-            "version": "==19.3.0"
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
++            "version": "==20.3.0"
+         },
+         "black": {
+             "hashes": [
+-                "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b",
+-                "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"
++                "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"
+             ],
+             "index": "pypi",
+-            "version": "==19.10b0"
++            "version": "==20.8b1"
+         },
+         "bleach": {
+             "hashes": [
+-                "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f",
+-                "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b"
++                "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125",
++                "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"
+             ],
+-            "version": "==3.1.5"
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
++            "version": "==3.3.0"
+         },
+         "certifi": {
+             "hashes": [
+-                "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3",
+-                "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"
++                "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c",
++                "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"
+             ],
+-            "version": "==2020.6.20"
++            "version": "==2020.12.5"
+         },
+         "chardet": {
+             "hashes": [
+-                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
+-                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
++                "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa",
++                "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"
+             ],
+-            "version": "==3.0.4"
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
++            "version": "==4.0.0"
+         },
+         "click": {
+             "hashes": [
+                 "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a",
+                 "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"
+             ],
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+             "version": "==7.1.2"
+         },
+         "colorama": {
+             "hashes": [
+-                "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff",
+-                "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"
++                "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
++                "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"
+             ],
+-            "markers": "sys_platform == 'win32'",
+-            "version": "==0.4.3"
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
++            "version": "==0.4.4"
+         },
+         "docutils": {
+             "hashes": [
+                 "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
+                 "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
+             ],
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+             "version": "==0.16"
+         },
+         "flake8": {
+             "hashes": [
+-                "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c",
+-                "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208"
++                "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839",
++                "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"
+             ],
+             "index": "pypi",
+-            "version": "==3.8.3"
++            "version": "==3.8.4"
+         },
+         "idna": {
+             "hashes": [
+                 "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
+                 "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
+             ],
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+             "version": "==2.10"
+         },
+-        "importlib-metadata": {
+-            "hashes": [
+-                "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83",
+-                "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"
+-            ],
+-            "markers": "python_version < '3.8'",
+-            "version": "==1.7.0"
+-        },
+         "iniconfig": {
+             "hashes": [
+-                "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437",
+-                "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"
++                "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3",
++                "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"
+             ],
+-            "version": "==1.0.1"
++            "version": "==1.1.1"
+         },
+         "keyring": {
+             "hashes": [
+-                "sha256:3401234209015144a5d75701e71cb47239e552b0882313e9f51e8976f9e27843",
+-                "sha256:c53e0e5ccde3ad34284a40ce7976b5b3a3d6de70344c3f8ee44364cc340976ec"
++                "sha256:9acb3e1452edbb7544822b12fd25459078769e560fa51f418b6d00afaa6178df",
++                "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"
+             ],
+-            "version": "==21.2.1"
++            "markers": "python_version >= '3.6'",
++            "version": "==22.0.1"
+         },
+         "mccabe": {
+             "hashes": [
+@@ -134,53 +124,57 @@
+             ],
+             "version": "==0.6.1"
+         },
+-        "more-itertools": {
++        "mypy-extensions": {
+             "hashes": [
+-                "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5",
+-                "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"
++                "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
++                "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
+             ],
+-            "version": "==8.4.0"
++            "version": "==0.4.3"
+         },
+         "packaging": {
+             "hashes": [
+-                "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8",
+-                "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"
++                "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5",
++                "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"
+             ],
+-            "version": "==20.4"
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
++            "version": "==20.9"
+         },
+         "pathspec": {
+             "hashes": [
+-                "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0",
+-                "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"
++                "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd",
++                "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"
+             ],
+-            "version": "==0.8.0"
++            "version": "==0.8.1"
+         },
+         "pkginfo": {
+             "hashes": [
+-                "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb",
+-                "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32"
++                "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4",
++                "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"
+             ],
+-            "version": "==1.5.0.1"
++            "version": "==1.7.0"
+         },
+         "pluggy": {
+             "hashes": [
+                 "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0",
+                 "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"
+             ],
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+             "version": "==0.13.1"
+         },
+         "py": {
+             "hashes": [
+-                "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2",
+-                "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"
++                "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3",
++                "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"
+             ],
+-            "version": "==1.9.0"
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
++            "version": "==1.10.0"
+         },
+         "pycodestyle": {
+             "hashes": [
+                 "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367",
+                 "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"
+             ],
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+             "version": "==2.6.0"
+         },
+         "pyflakes": {
+@@ -188,77 +182,93 @@
+                 "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92",
+                 "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"
+             ],
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+             "version": "==2.2.0"
+         },
+         "pygments": {
+             "hashes": [
+-                "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44",
+-                "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"
++                "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435",
++                "sha256:df49d09b498e83c1a73128295860250b0b7edd4c723a32e9bc0d295c7c2ec337"
+             ],
+-            "version": "==2.6.1"
++            "markers": "python_version >= '3.5'",
++            "version": "==2.7.4"
+         },
+         "pyparsing": {
+             "hashes": [
+-                "sha256:1060635ca5ac864c2b7bc7b05a448df4e32d7d8c65e33cbe1514810d339672a2",
+-                "sha256:56a551039101858c9e189ac9e66e330a03fb7079e97ba6b50193643905f450ce"
++                "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
++                "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
+             ],
+-            "version": "==3.0.0a2"
++            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
++            "version": "==2.4.7"
+         },
+         "pytest": {
+             "hashes": [
+-                "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4",
+-                "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad"
++                "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9",
++                "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"
+             ],
+             "index": "pypi",
+-            "version": "==6.0.1"
+-        },
+-        "pywin32-ctypes": {
+-            "hashes": [
+-                "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942",
+-                "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"
+-            ],
+-            "markers": "sys_platform == 'win32'",
+-            "version": "==0.2.0"
++            "version": "==6.2.2"
+         },
+         "readme-renderer": {
+             "hashes": [
+-                "sha256:cbe9db71defedd2428a1589cdc545f9bd98e59297449f69d721ef8f1cfced68d",
+-                "sha256:cc4957a803106e820d05d14f71033092537a22daa4f406dfbdd61177e0936376"
++                "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d",
++                "sha256:6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a"
+             ],
+-            "version": "==26.0"
++            "version": "==28.0"
+         },
+         "regex": {
+             "hashes": [
+-                "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204",
+-                "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162",
+-                "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f",
+-                "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb",
+-                "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6",
+-                "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7",
+-                "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88",
+-                "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99",
+-                "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644",
+-                "sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a",
+-                "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840",
+-                "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067",
+-                "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd",
+-                "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4",
+-                "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e",
+-                "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89",
+-                "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e",
+-                "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc",
+-                "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf",
+-                "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341",
+-                "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"
+-            ],
+-            "version": "==2020.7.14"
++                "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538",
++                "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4",
++                "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc",
++                "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa",
++                "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444",
++                "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1",
++                "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af",
++                "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8",
++                "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9",
++                "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88",
++                "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba",
++                "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364",
++                "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e",
++                "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7",
++                "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0",
++                "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31",
++                "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683",
++                "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee",
++                "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b",
++                "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884",
++                "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c",
++                "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e",
++                "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562",
++                "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85",
++                "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c",
++                "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6",
++                "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d",
++                "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b",
++                "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70",
++                "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b",
++                "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b",
++                "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f",
++                "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0",
++                "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5",
++                "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5",
++                "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f",
++                "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e",
++                "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512",
++                "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d",
++                "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917",
++                "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"
++            ],
++            "version": "==2020.11.13"
+         },
+         "requests": {
+             "hashes": [
+-                "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b",
+-                "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
++                "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804",
++                "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"
+             ],
+-            "version": "==2.24.0"
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
++            "version": "==2.25.1"
+         },
+         "requests-toolbelt": {
+             "hashes": [
+@@ -279,63 +289,83 @@
+                 "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259",
+                 "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
+             ],
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+             "version": "==1.15.0"
+         },
+         "toml": {
+             "hashes": [
+-                "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f",
+-                "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"
++                "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
++                "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
+             ],
+-            "version": "==0.10.1"
++            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
++            "version": "==0.10.2"
+         },
+         "tqdm": {
+             "hashes": [
+-                "sha256:6baa75a88582b1db6d34ce4690da5501d2a1cb65c34664840a456b2c9f794d29",
+-                "sha256:fcb7cb5b729b60a27f300b15c1ffd4744f080fb483b88f31dc8654b082cc8ea5"
++                "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a",
++                "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65"
+             ],
+-            "version": "==4.48.0"
++            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
++            "version": "==4.56.0"
+         },
+         "twine": {
+             "hashes": [
+-                "sha256:34352fd52ec3b9d29837e6072d5a2a7c6fe4290e97bba46bb8d478b5c598f7ab",
+-                "sha256:ba9ff477b8d6de0c89dd450e70b2185da190514e91c42cc62f96850025c10472"
++                "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41",
++                "sha256:fcffa8fc37e8083a5be0728371f299598870ee1eccc94e9a25cef7b1dcfa8297"
+             ],
+             "index": "pypi",
+-            "version": "==3.2.0"
++            "version": "==3.3.0"
+         },
+         "typed-ast": {
+             "hashes": [
+-                "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
+-                "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
+-                "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
+-                "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
+-                "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
+-                "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
+-                "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
+-                "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
+-                "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
+-                "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
+-                "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
+-                "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
+-                "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
+-                "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
+-                "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
+-                "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
+-                "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
+-                "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
+-                "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
+-                "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
+-                "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
+-            ],
+-            "version": "==1.4.1"
++                "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1",
++                "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d",
++                "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6",
++                "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd",
++                "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37",
++                "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151",
++                "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07",
++                "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440",
++                "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70",
++                "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496",
++                "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea",
++                "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400",
++                "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc",
++                "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606",
++                "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc",
++                "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581",
++                "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412",
++                "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a",
++                "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2",
++                "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787",
++                "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f",
++                "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937",
++                "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64",
++                "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487",
++                "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b",
++                "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41",
++                "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a",
++                "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3",
++                "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166",
++                "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"
++            ],
++            "version": "==1.4.2"
++        },
++        "typing-extensions": {
++            "hashes": [
++                "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918",
++                "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c",
++                "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"
++            ],
++            "version": "==3.7.4.3"
+         },
+         "urllib3": {
+             "hashes": [
+-                "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a",
+-                "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"
++                "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80",
++                "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"
+             ],
+             "index": "pypi",
+-            "version": "==1.25.10"
++            "version": "==1.26.3"
+         },
+         "webencodings": {
+             "hashes": [
+@@ -346,18 +376,11 @@
+         },
+         "wheel": {
+             "hashes": [
+-                "sha256:8788e9155fe14f54164c1b9eb0a319d98ef02c160725587ad60f14ddc57b6f96",
+-                "sha256:df277cb51e61359aba502208d680f90c0493adec6f0e848af94948778aed386e"
++                "sha256:78b5b185f0e5763c26ca1e324373aadd49182ca90e825f7853f4b2509215dc0e",
++                "sha256:e11eefd162658ea59a60a0f6c7d493a7190ea4b9a85e335b33489d9f17e0245e"
+             ],
+             "index": "pypi",
+-            "version": "==0.34.2"
+-        },
+-        "zipp": {
+-            "hashes": [
+-                "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b",
+-                "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"
+-            ],
+-            "version": "==3.1.0"
++            "version": "==0.36.2"
+         }
+     }
+ }
+diff --git a/setup.py b/setup.py
+index 5c55092..406c1c4 100644
+--- a/setup.py
++++ b/setup.py
+@@ -11,7 +11,7 @@ with open("README.rst") as f:
+ 
+ setup(
+     name="whatthepatch",
+-    version="1.0.1",
++    version="1.0.2",
+     author="Christopher S. Corley",
+     author_email="cscorley@gmail.com",
+     description="A patch parsing and application library.",
+-- 
+2.37.0
+
diff --git a/textproc/py-whatthepatch/pkg-descr b/textproc/py-whatthepatch/pkg-descr
new file mode 100644
index 000000000000..641ce9409845
--- /dev/null
+++ b/textproc/py-whatthepatch/pkg-descr
@@ -0,0 +1,13 @@
+Features:
+- Parsing of almost all diff formats (except forwarded ed)
+  - normal (default, --normal)
+  - copied context (-c, --context)
+  - unified context (-u, --unified)
+  - ed script (-e, --ed)
+  - rcs ed script (-n, --rcs)
+- Parsing of several SCM patches
+  - CVS
+  - SVN
+  - Git
+
+WWW: https://github.com/cscorley/whatthepatch