aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hurling <rhurlin@FreeBSD.org>2022-07-12 16:52:49 +0000
committerRainer Hurling <rhurlin@FreeBSD.org>2022-07-12 17:06:48 +0000
commit4ed2bd37b0219eacf261cd82f44dad7bc18c005d (patch)
treef32a85b87aca2684a17a981f81cbc9d7319781e1
parent8a8b3beec3b3e57ca78671eb50c7f794b8421bb4 (diff)
downloadports-4ed2bd37b0219eacf261cd82f44dad7bc18c005d.tar.gz
ports-4ed2bd37b0219eacf261cd82f44dad7bc18c005d.zip
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
-rw-r--r--textproc/Makefile1
-rw-r--r--textproc/py-whatthepatch/Makefile19
-rw-r--r--textproc/py-whatthepatch/distinfo3
-rw-r--r--textproc/py-whatthepatch/files/0001-Fix-unified-diff-parse-error.patch144
-rw-r--r--textproc/py-whatthepatch/files/0002-Update-to-support-3.9-on-build-and-cut-new-version.patch580
-rw-r--r--textproc/py-whatthepatch/pkg-descr13
6 files changed, 760 insertions, 0 deletions
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