<pre style='margin:0'>
Aaron Madlon-Kay (amake) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/b46353e21619e4847f78b5e3174644ede29e1f74">https://github.com/macports/macports-ports/commit/b46353e21619e4847f78b5e3174644ede29e1f74</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit b46353e21619e4847f78b5e3174644ede29e1f74
</span>Author: Aaron Madlon-Kay <amake@macports.org>
AuthorDate: Thu Sep 30 23:13:52 2021 +0900

<span style='display:block; white-space:pre;color:#404040;'>    py-scrapy: remove optional dependencies to fix deps' incompatibility
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Twisted requires priority<2.0 (if present) for its [http2] extra. Recent patches
</span><span style='display:block; white-space:pre;color:#404040;'>    to Scrapy remove the requirement for twisted[http2] so we simply remove the
</span><span style='display:block; white-space:pre;color:#404040;'>    relevant dependencies.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Fixes https://trac.macports.org/ticket/63475
</span>---
 python/py-scrapy/Portfile                          |  53 ++--
 .../files/install-requires-setuptools.patch        |  22 ++
 .../py-scrapy/files/twisted-http2-optional.patch   | 285 +++++++++++++++++++++
 3 files changed, 340 insertions(+), 20 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-scrapy/Portfile b/python/py-scrapy/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index b01d22e5a5c..210b63759a0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/python/py-scrapy/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-scrapy/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -31,23 +31,21 @@ checksums               rmd160  63a31248b7a5b769a6cca544f47e180ce3a5ed07 \
</span> python.versions 27 36 37 38 39
 
 if {${name} ne ${subport}} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    depends_build-append    port:py${python.version}-setuptools
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    depends_lib-append      port:py${python.version}-cssselect \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-dispatcher \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-h2 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-itemadapter \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-itemloaders \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-lxml \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-openssl \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-parsel \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-priority \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-protego \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-queuelib \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-service_identity \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-twisted \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-w3lib \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-zopeinterface
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    depends_run-append      port:${rootname_lower}_select
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_lib-append  \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-twisted \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-cryptography \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-cssselect \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-parsel \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-openssl \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-queuelib \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-service_identity \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-w3lib \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-zopeinterface \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-protego \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-dispatcher \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:py${python.version}-lxml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_run-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port:${rootname_lower}_select
</span> 
     # Note testing is currently broken; if you want to test:
     # 0) Install the version you want to use
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -85,11 +83,26 @@ if {${name} ne ${subport}} {
</span>                             sha256  fe06576f9a4971de9dc0175c60fd92561e8275f2bad585c1cb5d65c5181b2db0 \
                             size    977658
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        depends_lib-append  port:py${python.version}-functools32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depends_lib-delete  port:py${python.version}-itemadapter \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-itemloaders
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Dependencies:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # https://github.com/scrapy/scrapy/blob/be2e910dd06ba4904e7b10eb5a7e3251e8dab099/setup.py#L67
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_lib-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            port:py${python.version}-six
</span> 
         test.run            no
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Dependencies:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # https://github.com/scrapy/scrapy/blob/e63188cbf753d560e43d8489c821bd6eb9fe54e9/setup.py#L21
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # But note that patches add setuptools and remove h2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        depends_lib-append  \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            port:py${python.version}-setuptools \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            port:py${python.version}-itemloaders \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            port:py${python.version}-itemadapter
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # TODO: remove these patches when updating past 2.5.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        patchfiles-append   install-requires-setuptools.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            twisted-http2-optional.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        patch.pre_args      -p1
</span>     }
 
     select.group     ${rootname_lower}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-scrapy/files/install-requires-setuptools.patch b/python/py-scrapy/files/install-requires-setuptools.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..03dab32c9bf
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-scrapy/files/install-requires-setuptools.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,22 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 4f500342c8ad4674b191e1fab0d1b2ac944d7d3e Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hrn=C4=8Diar?= <tomas.hrnciar@me.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 28 Apr 2021 11:57:44 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Require setuptools, scrapy/cmdline.py, /setup.py and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tests/test_webclient.py import pkg_resources
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ setup.py | 1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/setup.py b/setup.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2b60a10af4..b1bb64575e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/setup.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/setup.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -32,6 +32,7 @@ def has_environment_marker_platform_impl_support():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'protego>=0.1.15',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'itemadapter>=0.1.0',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'h2>=3.0,<4.0',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    'setuptools',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extras_require = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cpython_dependencies = [
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-scrapy/files/twisted-http2-optional.patch b/python/py-scrapy/files/twisted-http2-optional.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..a9d2ccd5d9b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-scrapy/files/twisted-http2-optional.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,285 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From c5b1ee810167266fcd259f263dbfc0fe0204761a Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: =?UTF-8?q?Adri=C3=A1n=20Chaves?= <adrian@chaves.io>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 11 May 2021 09:04:53 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Make Twisted[http2] installation optional (#5113)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Co-authored-by: Eugenio Lacuesta <eugenio.lacuesta@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ conftest.py                             |  9 +++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ docs/topics/settings.rst                | 14 ++++++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ setup.py                                |  3 +--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tests/test_downloader_handlers_http2.py | 26 ++++++++++++++++++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tests/test_http2_client_protocol.py     | 13 ++++++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tox.ini                                 | 11 +++++------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 6 files changed, 53 insertions(+), 23 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/conftest.py b/conftest.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e4dd80de0d..4931c5a796 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/conftest.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/conftest.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from pathlib import Path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import pytest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from twisted.web.http import H2_ENABLED
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from scrapy.utils.reactor import install_reactor
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -25,6 +26,14 @@ def _py_files(folder):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if file_path and file_path[0] != '#':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         collect_ignore.append(file_path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if not H2_ENABLED:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    collect_ignore.extend(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        (
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            'scrapy/core/downloader/handlers/http2.py',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            *_py_files("scrapy/core/http2"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @pytest.fixture()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def chdir(tmpdir):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/docs/topics/settings.rst b/docs/topics/settings.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2506497e25..0b290598f2 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/docs/topics/settings.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/docs/topics/settings.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -680,12 +680,16 @@ handler (without replacement), place this in your ``settings.py``::
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .. _http2:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-The default HTTPS handler uses HTTP/1.1. To use HTTP/2 update
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-:setting:`DOWNLOAD_HANDLERS` as follows::
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++The default HTTPS handler uses HTTP/1.1. To use HTTP/2:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    DOWNLOAD_HANDLERS = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        'https': 'scrapy.core.downloader.handlers.http2.H2DownloadHandler',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#.  Install ``Twisted[http2]>=17.9.0`` to install the packages required to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    enable HTTP/2 support in Twisted.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#.  Update :setting:`DOWNLOAD_HANDLERS` as follows::
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        DOWNLOAD_HANDLERS = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            'https': 'scrapy.core.downloader.handlers.http2.H2DownloadHandler',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .. warning::
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/setup.py b/setup.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b1bb64575e..ed2b6e3473 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/setup.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/setup.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -19,7 +19,7 @@ def has_environment_marker_platform_impl_support():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ install_requires = [
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    'Twisted[http2]>=17.9.0',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    'Twisted>=17.9.0',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'cryptography>=2.0',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'cssselect>=0.9.1',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'itemloaders>=1.0.1',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -31,7 +31,6 @@ def has_environment_marker_platform_impl_support():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'zope.interface>=4.1.3',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'protego>=0.1.15',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'itemadapter>=0.1.0',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    'h2>=3.0,<4.0',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'setuptools',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extras_require = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/tests/test_downloader_handlers_http2.py b/tests/test_downloader_handlers_http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 4397780148..53bb4fe929 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/tests/test_downloader_handlers_http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/tests/test_downloader_handlers_http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import json
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from unittest import mock
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from unittest import mock, skipIf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from pytest import mark
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from testfixtures import LogCapture
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -7,8 +7,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.trial import unittest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.web import server
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.web.error import SchemeNotSupported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from twisted.web.http import H2_ENABLED
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from scrapy.core.downloader.handlers.http2 import H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from scrapy.http import Request
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from scrapy.spiders import Spider
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from scrapy.utils.misc import create_instance
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -21,11 +21,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@skipIf(not H2_ENABLED, "HTTP/2 support in Twisted is not enabled")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Https2TestCase(Https11TestCase):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     scheme = 'https'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    download_handler_cls = H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     HTTP2_DATALOSS_SKIP_REASON = "Content-Length mismatch raises InvalidBodyLengthError"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    @classmethod
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    def setUpClass(cls):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        from scrapy.core.downloader.handlers.http2 import H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        cls.download_handler_cls = H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def test_protocol(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         request = Request(self.getURL("host"), method="GET")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         d = self.download_request(request, Spider("foo"))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -187,9 +193,14 @@ def setUp(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         super(Https2InvalidDNSPattern, self).setUp()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@skipIf(not H2_ENABLED, "HTTP/2 support in Twisted is not enabled")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Https2CustomCiphers(Https11CustomCiphers):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     scheme = 'https'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    download_handler_cls = H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    @classmethod
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    def setUpClass(cls):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        from scrapy.core.downloader.handlers.http2 import H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        cls.download_handler_cls = H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Http2MockServerTestCase(Http11MockServerTestCase):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -201,6 +212,7 @@ class Http2MockServerTestCase(Http11MockServerTestCase):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@skipIf(not H2_ENABLED, "HTTP/2 support in Twisted is not enabled")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Https2ProxyTestCase(Http11ProxyTestCase):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # only used for HTTPS tests
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     keyfile = 'keys/localhost.key'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -209,9 +221,13 @@ class Https2ProxyTestCase(Http11ProxyTestCase):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     scheme = 'https'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     host = u'127.0.0.1'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    download_handler_cls = H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     expected_http_proxy_request_body = b'/'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    @classmethod
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    def setUpClass(cls):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        from scrapy.core.downloader.handlers.http2 import H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        cls.download_handler_cls = H2DownloadHandler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def setUp(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         site = server.Site(UriResource(), timeout=None)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self.port = reactor.listenSSL(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/tests/test_http2_client_protocol.py b/tests/test_http2_client_protocol.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8b2f6a11df..677ede92ba 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/tests/test_http2_client_protocol.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/tests/test_http2_client_protocol.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5,10 +5,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import shutil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from ipaddress import IPv4Address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from unittest import mock
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from unittest import mock, skipIf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from urllib.parse import urlencode
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from h2.exceptions import InvalidBodyLengthError
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.internet import reactor
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.internet.defer import CancelledError, Deferred, DeferredList, inlineCallbacks
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.internet.endpoints import SSL4ClientEndpoint, SSL4ServerEndpoint
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -17,12 +16,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.python.failure import Failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.trial.unittest import TestCase
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.web.client import ResponseFailed, URI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from twisted.web.http import Request as TxRequest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from twisted.web.http import H2_ENABLED, Request as TxRequest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.web.server import Site, NOT_DONE_YET
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from twisted.web.static import File
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from scrapy.core.http2.protocol import H2ClientFactory, H2ClientProtocol
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from scrapy.core.http2.stream import InactiveStreamClosed, InvalidHostname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from scrapy.http import Request, Response, JsonRequest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from scrapy.settings import Settings
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from scrapy.spiders import Spider
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -173,6 +170,7 @@ def get_client_certificate(key_file, certificate_file) -> PrivateCertificate:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return PrivateCertificate.loadPEM(pem)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@skipIf(not H2_ENABLED, "HTTP/2 support in Twisted is not enabled")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Https2ClientProtocolTestCase(TestCase):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     scheme = 'https'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     key_file = os.path.join(os.path.dirname(__file__), 'keys', 'localhost.key')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -220,6 +218,7 @@ def setUp(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         uri = URI.fromBytes(bytes(self.get_url('/'), 'utf-8'))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self.conn_closed_deferred = Deferred()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        from scrapy.core.http2.protocol import H2ClientFactory
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         h2_client_factory = H2ClientFactory(uri, Settings(), self.conn_closed_deferred)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         client_endpoint = SSL4ClientEndpoint(reactor, self.hostname, self.port_number, client_options)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self.client = yield client_endpoint.connect(h2_client_factory)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -426,6 +425,7 @@ def test_received_dataloss_response(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         def assert_failure(failure: Failure):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.assertTrue(len(failure.value.reasons) > 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            from h2.exceptions import InvalidBodyLengthError
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.assertTrue(any(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 isinstance(error, InvalidBodyLengthError)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 for error in failure.value.reasons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -511,6 +511,7 @@ def test_inactive_stream(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         def assert_inactive_stream(failure):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.assertIsNotNone(failure.check(ResponseFailed))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            from scrapy.core.http2.stream import InactiveStreamClosed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.assertTrue(any(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 isinstance(e, InactiveStreamClosed)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 for e in failure.value.reasons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -596,6 +597,7 @@ def _check_invalid_netloc(self, url):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         request = Request(url)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         def assert_invalid_hostname(failure: Failure):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            from scrapy.core.http2.stream import InvalidHostname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.assertIsNotNone(failure.check(InvalidHostname))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             error_msg = str(failure.value)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.assertIn('localhost', error_msg)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -633,6 +635,7 @@ def test_connection_timeout(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         def assert_timeout_error(failure: Failure):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             for err in failure.value.reasons:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                from scrapy.core.http2.protocol import H2ClientProtocol
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 if isinstance(err, TimeoutError):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     self.assertIn(f"Connection was IDLE for more than {H2ClientProtocol.IDLE_TIMEOUT}s", str(err))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/tox.ini b/tox.ini
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5b0606f8fb..8167aff962 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/tox.ini
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/tox.ini
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -50,6 +50,8 @@ commands =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ basepython = python3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ deps =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {[testenv]deps}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    # Twisted[http2] is required to import some files
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Twisted[http2]>=17.9.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     pytest-flake8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ commands =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     py.test --flake8 {posargs:docs scrapy tests}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -57,12 +59,7 @@ commands =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [testenv:pylint]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ basepython = python3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ deps =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    {[testenv]deps}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    # Optional dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    boto
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    reppy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    robotexclusionrulesparser
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    # Test dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {[testenv:extra-deps]deps}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     pylint
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ commands =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     pylint conftest.py docs extras scrapy setup.py tests
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -119,9 +116,11 @@ setenv =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [testenv:extra-deps]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ deps =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {[testenv]deps}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    boto
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     reppy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     robotexclusionrulesparser
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Pillow>=4.0.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Twisted[http2]>=17.9.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [testenv:asyncio]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ commands =
</span></pre><pre style='margin:0'>

</pre>