14
0
forked from pool/python-vcrpy
Files
python-vcrpy/0001-Revert-v4.0.x-Remove-legacy-python-and-add-python3.8.patch
Tomáš Chvátal 781344b0a9 Accepting request 778703 from home:mcalabkova:branches:devel:languages:python
- Added patch 0001-Revert-v4.0.x-Remove-legacy-python-and-add-python3.8.patch
  * Enable python2 again since it breaks many packages.

OBS-URL: https://build.opensuse.org/request/show/778703
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-vcrpy?expand=0&rev=22
2020-02-24 09:27:05 +00:00

1215 lines
41 KiB
Diff

From bd3de7c8b762f7a1bdd947a0c2d817b4e70cd740 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mark=C3=A9ta=20Cal=C3=A1bkov=C3=A1?=
<meggy.calabkova@gmail.com>
Date: Mon, 24 Feb 2020 09:53:16 +0100
Subject: [PATCH] Revert "v4.0.x - Remove legacy python and add python3.8
support (#499)"
This reverts commit 4a8e80ee3e288c61a85a90d7f13c83d9e9a4db2e.
---
setup.py | 36 +-
tests/integration/test_basic.py | 2 +-
tests/integration/test_boto.py | 7 +-
tests/integration/test_config.py | 2 +-
tests/integration/test_disksaver.py | 2 +-
tests/integration/test_filter.py | 6 +-
tests/integration/test_httplib2.py | 4 +-
tests/integration/test_ignore.py | 2 +-
tests/integration/test_matchers.py | 2 +-
tests/integration/test_multiple.py | 2 +-
tests/integration/test_proxy.py | 7 +-
tests/integration/test_record_mode.py | 2 +-
tests/integration/test_register_matcher.py | 2 +-
tests/integration/test_register_persister.py | 2 +-
tests/integration/test_register_serializer.py | 2 +-
tests/integration/test_request.py | 2 +-
tests/integration/test_stubs.py | 2 +-
tests/integration/test_urllib2.py | 6 +-
tests/integration/test_wild.py | 15 +-
tests/unit/test_cassettes.py | 6 +-
tests/unit/test_errors.py | 3 +-
tests/unit/test_filters.py | 6 +-
tests/unit/test_matchers.py | 2 +-
tests/unit/test_response.py | 4 +
tests/unit/test_serialize.py | 5 +-
tests/unit/test_stubs.py | 5 +-
tests/unit/test_vcr.py | 6 +-
tox.ini | 35 +-
vcr/__init__.py | 19 +-
vcr/cassette.py | 15 +-
vcr/compat.py | 14 +
vcr/config.py | 10 +-
vcr/errors.py | 2 +-
vcr/filters.py | 32 +-
vcr/matchers.py | 5 +-
vcr/patch.py | 9 +-
vcr/persisters/filesystem.py | 4 +-
vcr/request.py | 10 +-
vcr/serializers/compat.py | 7 +-
vcr/stubs/__init__.py | 20 +-
vcr/stubs/aiohttp_stubs/__init__.py | 2 +
vcr/stubs/boto3_stubs.py | 5 +-
vcr/stubs/compat.py | 27 +-
vcr/stubs/tornado_stubs.py | 4 +-
vcr/util.py | 4 +-
57 files changed, 458 insertions(+), 484 deletions(-)
delete mode 100644 docs/_static/vcr.png
delete mode 100644 docs/_static/vcr.svg
create mode 100644 vcr/compat.py
Index: vcrpy-4.0.2/setup.py
===================================================================
--- vcrpy-4.0.2.orig/setup.py
+++ vcrpy-4.0.2/setup.py
@@ -1,31 +1,11 @@
#!/usr/bin/env python
-import codecs
-import os
-import re
import sys
from setuptools import setup, find_packages
from setuptools.command.test import test as TestCommand
long_description = open("README.rst", "r").read()
-here = os.path.abspath(os.path.dirname(__file__))
-
-
-def read(*parts):
- # intentionally *not* adding an encoding option to open, See:
- # https://github.com/pypa/virtualenv/issues/201#issuecomment-3145690
- with codecs.open(os.path.join(here, *parts), "r") as fp:
- return fp.read()
-
-
-def find_version(*file_paths):
- version_file = read(*file_paths)
- version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", version_file, re.M)
- if version_match:
- return version_match.group(1)
-
- raise RuntimeError("Unable to find version string.")
class PyTest(TestCommand):
@@ -46,21 +26,27 @@ install_requires = [
"PyYAML",
"wrapt",
"six>=1.5",
+ 'contextlib2; python_version=="2.7"',
+ 'mock; python_version=="2.7"',
'yarl; python_version>="3.6"',
'yarl<1.4; python_version=="3.5"',
]
+excluded_packages = ["tests*"]
+if sys.version_info[0] == 2:
+ excluded_packages.append("vcr.stubs.aiohttp_stubs")
+
setup(
name="vcrpy",
- version=find_version("vcr", "__init__.py"),
+ version="4.0.2",
description=("Automatically mock your HTTP interactions to simplify and speed up testing"),
long_description=long_description,
long_description_content_type="text/x-rst",
author="Kevin McCarthy",
author_email="me@kevinmccarthy.org",
url="https://github.com/kevin1024/vcrpy",
- packages=find_packages(exclude=["tests*"]),
- python_requires=">=3.5",
+ packages=find_packages(exclude=excluded_packages),
+ python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
install_requires=install_requires,
license="MIT",
tests_require=["pytest", "mock", "pytest-httpbin"],
@@ -69,12 +55,12 @@ setup(
"Environment :: Console",
"Intended Audience :: Developers",
"Programming Language :: Python",
+ "Programming Language :: Python :: 2",
+ "Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: Software Development :: Testing",
Index: vcrpy-4.0.2/tests/integration/test_basic.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_basic.py
+++ vcrpy-4.0.2/tests/integration/test_basic.py
@@ -3,7 +3,7 @@
# External imports
import os
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
# Internal imports
import vcr
Index: vcrpy-4.0.2/tests/integration/test_boto.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_boto.py
+++ vcrpy-4.0.2/tests/integration/test_boto.py
@@ -6,9 +6,14 @@ import boto # NOQA
import boto.iam # NOQA
from boto.s3.connection import S3Connection # NOQA
from boto.s3.key import Key # NOQA
-from configparser import DuplicateSectionError # NOQA
import vcr # NOQA
+try: # NOQA
+ from ConfigParser import DuplicateSectionError # NOQA
+except ImportError: # NOQA
+ # python3
+ from configparser import DuplicateSectionError # NOQA
+
def test_boto_stubs(tmpdir):
with vcr.use_cassette(str(tmpdir.join("boto-stubs.yml"))):
Index: vcrpy-4.0.2/tests/integration/test_config.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_config.py
+++ vcrpy-4.0.2/tests/integration/test_config.py
@@ -2,7 +2,7 @@ import os
import json
import pytest
import vcr
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
def test_set_serializer_default_config(tmpdir, httpbin):
Index: vcrpy-4.0.2/tests/integration/test_disksaver.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_disksaver.py
+++ vcrpy-4.0.2/tests/integration/test_disksaver.py
@@ -4,7 +4,7 @@
# External imports
import os
import time
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
# Internal imports
import vcr
Index: vcrpy-4.0.2/tests/integration/test_filter.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_filter.py
+++ vcrpy-4.0.2/tests/integration/test_filter.py
@@ -1,8 +1,8 @@
import base64
import pytest
-from urllib.request import urlopen, Request
-from urllib.parse import urlencode
-from urllib.error import HTTPError
+from six.moves.urllib.request import urlopen, Request
+from six.moves.urllib.parse import urlencode
+from six.moves.urllib.error import HTTPError
import vcr
import json
from assertions import assert_cassette_has_one_response, assert_is_json
Index: vcrpy-4.0.2/tests/integration/test_httplib2.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_httplib2.py
+++ vcrpy-4.0.2/tests/integration/test_httplib2.py
@@ -3,7 +3,7 @@
import sys
-from urllib.parse import urlencode
+from six.moves.urllib_parse import urlencode
import pytest
import pytest_httpbin.certs
@@ -111,7 +111,7 @@ def test_post_data(tmpdir, httpbin_both)
def test_post_unicode_data(tmpdir, httpbin_both):
"""Ensure that it works when posting unicode data"""
- data = urlencode({"snowman": "☃".encode()})
+ data = urlencode({"snowman": u"☃".encode("utf-8")})
url = httpbin_both.url + "/post"
with vcr.use_cassette(str(tmpdir.join("post_data.yaml"))):
_, res1 = http().request(url, "POST", data)
Index: vcrpy-4.0.2/tests/integration/test_ignore.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_ignore.py
+++ vcrpy-4.0.2/tests/integration/test_ignore.py
@@ -1,4 +1,4 @@
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
import socket
from contextlib import contextmanager
import vcr
Index: vcrpy-4.0.2/tests/integration/test_matchers.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_matchers.py
+++ vcrpy-4.0.2/tests/integration/test_matchers.py
@@ -1,6 +1,6 @@
import vcr
import pytest
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
DEFAULT_URI = "http://httpbin.org/get?p1=q1&p2=q2" # base uri for testing
Index: vcrpy-4.0.2/tests/integration/test_multiple.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_multiple.py
+++ vcrpy-4.0.2/tests/integration/test_multiple.py
@@ -1,6 +1,6 @@
import pytest
import vcr
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
def test_making_extra_request_raises_exception(tmpdir, httpbin):
Index: vcrpy-4.0.2/tests/integration/test_proxy.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_proxy.py
+++ vcrpy-4.0.2/tests/integration/test_proxy.py
@@ -5,9 +5,8 @@
import multiprocessing
import pytest
-import http.server
-import socketserver
-from urllib.request import urlopen
+from six.moves import socketserver, SimpleHTTPServer
+from six.moves.urllib.request import urlopen
# Internal imports
import vcr
@@ -16,7 +15,7 @@ import vcr
requests = pytest.importorskip("requests")
-class Proxy(http.server.SimpleHTTPRequestHandler):
+class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
"""
Simple proxy server.
Index: vcrpy-4.0.2/tests/integration/test_record_mode.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_record_mode.py
+++ vcrpy-4.0.2/tests/integration/test_record_mode.py
@@ -1,6 +1,6 @@
import pytest
import vcr
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
def test_once_record_mode(tmpdir, httpbin):
Index: vcrpy-4.0.2/tests/integration/test_register_matcher.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_register_matcher.py
+++ vcrpy-4.0.2/tests/integration/test_register_matcher.py
@@ -1,5 +1,5 @@
import vcr
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
def true_matcher(r1, r2):
Index: vcrpy-4.0.2/tests/integration/test_register_persister.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_register_persister.py
+++ vcrpy-4.0.2/tests/integration/test_register_persister.py
@@ -3,7 +3,7 @@
# External imports
import os
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
# Internal imports
import vcr
Index: vcrpy-4.0.2/tests/integration/test_register_serializer.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_register_serializer.py
+++ vcrpy-4.0.2/tests/integration/test_register_serializer.py
@@ -1,7 +1,7 @@
import vcr
-class MockSerializer:
+class MockSerializer(object):
def __init__(self):
self.serialize_count = 0
self.deserialize_count = 0
Index: vcrpy-4.0.2/tests/integration/test_request.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_request.py
+++ vcrpy-4.0.2/tests/integration/test_request.py
@@ -1,5 +1,5 @@
import vcr
-from urllib.request import urlopen
+from six.moves.urllib.request import urlopen
def test_recorded_request_uri_with_redirected_request(tmpdir, httpbin):
Index: vcrpy-4.0.2/tests/integration/test_stubs.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_stubs.py
+++ vcrpy-4.0.2/tests/integration/test_stubs.py
@@ -1,7 +1,7 @@
import vcr
import zlib
import json
-import http.client as httplib
+import six.moves.http_client as httplib
from assertions import assert_is_json
Index: vcrpy-4.0.2/tests/integration/test_urllib2.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_urllib2.py
+++ vcrpy-4.0.2/tests/integration/test_urllib2.py
@@ -2,8 +2,8 @@
"""Integration tests with urllib2"""
import ssl
-from urllib.request import urlopen
-from urllib.parse import urlencode
+from six.moves.urllib.request import urlopen
+from six.moves.urllib_parse import urlencode
import pytest_httpbin.certs
# Internal imports
@@ -104,7 +104,7 @@ def test_post_data(httpbin_both, tmpdir)
def test_post_unicode_data(httpbin_both, tmpdir):
"""Ensure that it works when posting unicode data"""
- data = urlencode({"snowman": "☃".encode()}).encode("utf-8")
+ data = urlencode({"snowman": u"☃".encode("utf-8")}).encode("utf-8")
url = httpbin_both.url + "/post"
with vcr.use_cassette(str(tmpdir.join("post_data.yaml"))):
res1 = urlopen_with_cafile(url, data).read()
Index: vcrpy-4.0.2/tests/integration/test_wild.py
===================================================================
--- vcrpy-4.0.2.orig/tests/integration/test_wild.py
+++ vcrpy-4.0.2/tests/integration/test_wild.py
@@ -1,13 +1,16 @@
-import http.client as httplib
import multiprocessing
import pytest
-from xmlrpc.client import ServerProxy
-from xmlrpc.server import SimpleXMLRPCServer
+from six.moves import xmlrpc_client, xmlrpc_server
requests = pytest.importorskip("requests")
import vcr # NOQA
+try:
+ import httplib
+except ImportError:
+ import http.client as httplib
+
def test_domain_redirect():
"""Ensure that redirects across domains are considered unique"""
@@ -77,7 +80,7 @@ def test_amazon_doctype(tmpdir):
def start_rpc_server(q):
- httpd = SimpleXMLRPCServer(("127.0.0.1", 0))
+ httpd = xmlrpc_server.SimpleXMLRPCServer(("127.0.0.1", 0))
httpd.register_function(pow)
q.put("http://{}:{}".format(*httpd.server_address))
httpd.serve_forever()
@@ -96,11 +99,11 @@ def rpc_server():
def test_xmlrpclib(tmpdir, rpc_server):
with vcr.use_cassette(str(tmpdir.join("xmlrpcvideo.yaml"))):
- roundup_server = ServerProxy(rpc_server, allow_none=True)
+ roundup_server = xmlrpc_client.ServerProxy(rpc_server, allow_none=True)
original_schema = roundup_server.pow(2, 4)
with vcr.use_cassette(str(tmpdir.join("xmlrpcvideo.yaml"))):
- roundup_server = ServerProxy(rpc_server, allow_none=True)
+ roundup_server = xmlrpc_client.ServerProxy(rpc_server, allow_none=True)
second_schema = roundup_server.pow(2, 4)
assert original_schema == second_schema
Index: vcrpy-4.0.2/tests/unit/test_cassettes.py
===================================================================
--- vcrpy-4.0.2.orig/tests/unit/test_cassettes.py
+++ vcrpy-4.0.2/tests/unit/test_cassettes.py
@@ -1,12 +1,12 @@
-import contextlib
import copy
-import http.client as httplib
import inspect
import os
-from unittest import mock
+from six.moves import http_client as httplib
import pytest
import yaml
+
+from vcr.compat import mock, contextlib
from vcr.cassette import Cassette
from vcr.errors import UnhandledHTTPRequestError
from vcr.patch import force_reset
@@ -208,7 +208,7 @@ def test_nesting_context_managers_by_che
def test_custom_patchers():
- class Test:
+ class Test(object):
attribute = None
with Cassette.use(path="custom_patches", custom_patches=((Test, "attribute", VCRHTTPSConnection),)):
Index: vcrpy-4.0.2/tests/unit/test_errors.py
===================================================================
--- vcrpy-4.0.2.orig/tests/unit/test_errors.py
+++ vcrpy-4.0.2/tests/unit/test_errors.py
@@ -1,7 +1,6 @@
-from unittest import mock
-
import pytest
+from vcr.compat import mock
from vcr import errors
from vcr.cassette import Cassette
Index: vcrpy-4.0.2/tests/unit/test_filters.py
===================================================================
--- vcrpy-4.0.2.orig/tests/unit/test_filters.py
+++ vcrpy-4.0.2/tests/unit/test_filters.py
@@ -1,4 +1,4 @@
-from io import BytesIO
+from six import BytesIO
from vcr.filters import (
remove_headers,
replace_headers,
@@ -8,10 +8,10 @@ from vcr.filters import (
replace_post_data_parameters,
decode_response,
)
+from vcr.compat import mock
from vcr.request import Request
import gzip
import json
-from unittest import mock
import zlib
Index: vcrpy-4.0.2/tests/unit/test_matchers.py
===================================================================
--- vcrpy-4.0.2.orig/tests/unit/test_matchers.py
+++ vcrpy-4.0.2/tests/unit/test_matchers.py
@@ -1,5 +1,5 @@
import itertools
-from unittest import mock
+from vcr.compat import mock
import pytest
Index: vcrpy-4.0.2/tests/unit/test_response.py
===================================================================
--- vcrpy-4.0.2.orig/tests/unit/test_response.py
+++ vcrpy-4.0.2/tests/unit/test_response.py
@@ -1,5 +1,8 @@
# coding: UTF-8
import io
+import unittest
+
+import six
from vcr.stubs import VCRHTTPResponse
@@ -55,6 +58,7 @@ def test_response_headers_should_have_co
assert response.headers.get("date") == "Fri, 24 Oct 2014 18:35:37 GMT"
+@unittest.skipIf(six.PY2, "Regression test for Python3 only")
def test_response_parses_correctly_and_fp_attribute_error_is_not_thrown():
"""
Regression test for https://github.com/kevin1024/vcrpy/issues/440
Index: vcrpy-4.0.2/tests/unit/test_serialize.py
===================================================================
--- vcrpy-4.0.2.orig/tests/unit/test_serialize.py
+++ vcrpy-4.0.2/tests/unit/test_serialize.py
@@ -1,8 +1,7 @@
# -*- encoding: utf-8 -*-
-from unittest import mock
-
import pytest
+from vcr.compat import mock
from vcr.request import Request
from vcr.serialize import deserialize, serialize
from vcr.serializers import yamlserializer, jsonserializer, compat
@@ -30,7 +29,7 @@ def test_deserialize_new_json_cassette()
deserialize(f.read(), jsonserializer)
-REQBODY_TEMPLATE = """\
+REQBODY_TEMPLATE = u"""\
interactions:
- request:
body: {req_body}
Index: vcrpy-4.0.2/tests/unit/test_stubs.py
===================================================================
--- vcrpy-4.0.2.orig/tests/unit/test_stubs.py
+++ vcrpy-4.0.2/tests/unit/test_stubs.py
@@ -1,10 +1,9 @@
-from unittest import mock
-
from vcr.stubs import VCRHTTPSConnection
+from vcr.compat import mock
from vcr.cassette import Cassette
-class TestVCRConnection:
+class TestVCRConnection(object):
def test_setting_of_attributes_get_propogated_to_real_connection(self):
vcr_connection = VCRHTTPSConnection("www.examplehost.com")
vcr_connection.ssl_version = "example_ssl_version"
Index: vcrpy-4.0.2/tests/unit/test_vcr.py
===================================================================
--- vcrpy-4.0.2.orig/tests/unit/test_vcr.py
+++ vcrpy-4.0.2/tests/unit/test_vcr.py
@@ -1,10 +1,10 @@
-from unittest import mock
import os
import pytest
-import http.client as httplib
+from six.moves import http_client as httplib
from vcr import VCR, use_cassette
+from vcr.compat import mock
from vcr.request import Request
from vcr.stubs import VCRHTTPSConnection
from vcr.patch import _HTTPConnection, force_reset
@@ -170,7 +170,7 @@ def test_fixtures_with_use_cassette(rand
def test_custom_patchers():
- class Test:
+ class Test(object):
attribute = None
attribute2 = None
Index: vcrpy-4.0.2/tox.ini
===================================================================
--- vcrpy-4.0.2.orig/tox.ini
+++ vcrpy-4.0.2/tox.ini
@@ -3,8 +3,8 @@ skip_missing_interpreters=true
envlist =
cov-clean,
lint,
- {py35,py36,py37,py38}-{requests,httplib2,urllib3,tornado4,boto3,aiohttp},
- {pypy3}-{requests,httplib2,urllib3,tornado4,boto3},
+ {py27,py35,py36,py37,py38,pypy,pypy3}-{requests,httplib2,urllib3,tornado4,boto3},
+ {py35,py36,py37,py38}-{aiohttp},
cov-report
@@ -34,27 +34,6 @@ deps =
flake8
black
-[testenv:docs]
-# Running sphinx from inside the "docs" directory
-# ensures it will not pick up any stray files that might
-# get into a virtual environment under the top-level directory
-# or other artifacts under build/
-changedir = docs
-# The only dependency is sphinx
-# If we were using extensions packaged separately,
-# we would specify them here.
-# A better practice is to specify a specific version of sphinx.
-deps =
- sphinx
- sphinx_rtd_theme
-# This is the sphinx command to generate HTML.
-# In other circumstances, we might want to generate a PDF or an ebook
-commands =
- sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html
-# We use Python 3.7. Tox sometimes tries to autodetect it based on the name of
-# the testenv, but "docs" does not give useful clues so we have to be explicit.
-basepython = python3.7
-
[testenv]
# Need to use develop install so that paths
# for aggregate code coverage combine
@@ -71,17 +50,17 @@ deps =
requests: requests>=2.22.0
httplib2: httplib2
urllib3: urllib3
- {py35,py36}-tornado4: tornado>=4,<5
- {py35,py36}-tornado4: pytest-tornado
- {py35,py36}-tornado4: pycurl
+ {py27,py35,py36,pypy}-tornado4: tornado>=4,<5
+ {py27,py35,py36,pypy}-tornado4: pytest-tornado
+ {py27,py35,py36}-tornado4: pycurl
boto3: boto3
boto3: urllib3
aiohttp: aiohttp
aiohttp: pytest-asyncio
aiohttp: pytest-aiohttp
depends =
- lint,{py35,py36,py37,py38,pypy3}-{requests,httplib2,urllib3,tornado4,boto3},{py35,py36,py37,py38}-{aiohttp}: cov-clean
- cov-report: lint,{py35,py36,py37,py38,pypy3}-{requests,httplib2,urllib3,tornado4,boto3},{py35,py36,py37,py38}-{aiohttp}
+ {py27,py35,py36,py37,pypy}-{lint,requests,httplib2,urllib3,tornado4,boto3},{py35,py36,py37}-{aiohttp}: cov-clean
+ cov-report: {py27,py35,py36,py37,pypy}-{lint,requests,httplib2,urllib3,tornado4,boto3},{py35,py36,py37}-{aiohttp}
passenv =
AWS_ACCESS_KEY_ID
AWS_DEFAULT_REGION
Index: vcrpy-4.0.2/vcr/__init__.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/__init__.py
+++ vcrpy-4.0.2/vcr/__init__.py
@@ -1,8 +1,23 @@
import logging
+import warnings
+import sys
from .config import VCR
-from logging import NullHandler
-__version__ = "4.0.2"
+# Set default logging handler to avoid "No handler found" warnings.
+try: # Python 2.7+
+ from logging import NullHandler
+except ImportError:
+
+ class NullHandler(logging.Handler):
+ def emit(self, record):
+ pass
+
+
+if sys.version_info[0] == 2:
+ warnings.warn(
+ "Python 2.x support of vcrpy is deprecated and will be removed in an upcoming major release.",
+ DeprecationWarning,
+ )
logging.getLogger(__name__).addHandler(NullHandler())
Index: vcrpy-4.0.2/vcr/cassette.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/cassette.py
+++ vcrpy-4.0.2/vcr/cassette.py
@@ -1,5 +1,4 @@
import collections
-import contextlib
import copy
import sys
import inspect
@@ -7,13 +6,13 @@ import logging
import wrapt
+from .compat import contextlib
from .errors import UnhandledHTTPRequestError
from .matchers import requests_match, uri, method, get_matchers_results
from .patch import CassettePatcherBuilder
from .serializers import yamlserializer
from .persisters.filesystem import FilesystemPersister
from .util import partition_dict
-from ._handle_coroutine import handle_coroutine
try:
from asyncio import iscoroutinefunction
@@ -23,10 +22,18 @@ except ImportError:
return False
+if sys.version_info[:2] >= (3, 5):
+ from ._handle_coroutine import handle_coroutine
+else:
+
+ def handle_coroutine(*args, **kwags):
+ raise NotImplementedError("Not implemented on Python 2")
+
+
log = logging.getLogger(__name__)
-class CassetteContextDecorator:
+class CassetteContextDecorator(object):
"""Context manager/decorator that handles installing the cassette and
removing cassettes.
@@ -152,7 +159,7 @@ class CassetteContextDecorator:
return new_args_getter
-class Cassette:
+class Cassette(object):
"""A container for recorded requests and responses"""
@classmethod
Index: vcrpy-4.0.2/vcr/compat.py
===================================================================
--- /dev/null
+++ vcrpy-4.0.2/vcr/compat.py
@@ -0,0 +1,14 @@
+try:
+ from unittest import mock
+except ImportError:
+ import mock
+
+try:
+ import contextlib
+except ImportError:
+ import contextlib2 as contextlib
+else:
+ if not hasattr(contextlib, "ExitStack"):
+ import contextlib2 as contextlib
+
+__all__ = ["mock", "contextlib"]
Index: vcrpy-4.0.2/vcr/config.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/config.py
+++ vcrpy-4.0.2/vcr/config.py
@@ -1,6 +1,9 @@
import copy
-from collections import abc as collections_abc
+try:
+ from collections import abc as collections_abc # only works on python 3.3+
+except ImportError:
+ import collections as collections_abc
import functools
import inspect
import os
@@ -16,7 +19,7 @@ from . import matchers
from . import filters
-class VCR:
+class VCR(object):
@staticmethod
def is_test_method(method_name, function):
return method_name.startswith("test") and isinstance(function, types.FunctionType)
@@ -99,7 +102,7 @@ class VCR:
return matchers
def use_cassette(self, path=None, **kwargs):
- if path is not None and not isinstance(path, str):
+ if path is not None and not isinstance(path, six.string_types):
function = path
# Assume this is an attempt to decorate a function
return self._use_cassette(**kwargs)(function)
@@ -248,5 +251,4 @@ class VCR:
def test_case(self, predicate=None):
predicate = predicate or self.is_test_method
- # TODO: Remove this reference to `six` in favor of the Python3 equivalent
return six.with_metaclass(auto_decorate(self.use_cassette, predicate))
Index: vcrpy-4.0.2/vcr/errors.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/errors.py
+++ vcrpy-4.0.2/vcr/errors.py
@@ -3,7 +3,7 @@ class CannotOverwriteExistingCassetteExc
self.cassette = kwargs["cassette"]
self.failed_request = kwargs["failed_request"]
message = self._get_message(kwargs["cassette"], kwargs["failed_request"])
- super().__init__(message)
+ super(CannotOverwriteExistingCassetteException, self).__init__(message)
@staticmethod
def _get_message(cassette, failed_request):
Index: vcrpy-4.0.2/vcr/filters.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/filters.py
+++ vcrpy-4.0.2/vcr/filters.py
@@ -1,5 +1,5 @@
-from io import BytesIO
-from urllib.parse import urlparse, urlencode, urlunparse
+from six import BytesIO, text_type
+from six.moves.urllib.parse import urlparse, urlencode, urlunparse
import copy
import json
import zlib
@@ -8,11 +8,13 @@ from .util import CaseInsensitiveDict
def replace_headers(request, replacements):
- """Replace headers in request according to replacements.
- The replacements should be a list of (key, value) pairs where the value can be any of:
- 1. A simple replacement string value.
- 2. None to remove the given header.
- 3. A callable which accepts (key, value, request) and returns a string value or None.
+ """
+ Replace headers in request according to replacements. The replacements
+ should be a list of (key, value) pairs where the value can be any of:
+ 1. A simple replacement string value.
+ 2. None to remove the given header.
+ 3. A callable which accepts (key, value, request) and returns a string
+ value or None.
"""
new_headers = request.headers.copy()
for k, rv in replacements:
@@ -35,9 +37,10 @@ def remove_headers(request, headers_to_r
def replace_query_parameters(request, replacements):
- """Replace query parameters in request according to replacements.
-
- The replacements should be a list of (key, value) pairs where the value can be any of:
+ """
+ Replace query parameters in request according to replacements. The
+ replacements should be a list of (key, value) pairs where the value can be
+ any of:
1. A simple replacement string value.
2. None to remove the given header.
3. A callable which accepts (key, value, request) and returns a string
@@ -70,9 +73,10 @@ def remove_query_parameters(request, que
def replace_post_data_parameters(request, replacements):
- """Replace post data in request--either form data or json--according to replacements.
-
- The replacements should be a list of (key, value) pairs where the value can be any of:
+ """
+ Replace post data in request--either form data or json--according to
+ replacements. The replacements should be a list of (key, value) pairs where
+ the value can be any of:
1. A simple replacement string value.
2. None to remove the given header.
3. A callable which accepts (key, value, request) and returns a string
@@ -95,7 +99,7 @@ def replace_post_data_parameters(request
json_data[k] = rv
request.body = json.dumps(json_data).encode("utf-8")
else:
- if isinstance(request.body, str):
+ if isinstance(request.body, text_type):
request.body = request.body.encode("utf-8")
splits = [p.partition(b"=") for p in request.body.split(b"&")]
new_splits = []
Index: vcrpy-4.0.2/vcr/matchers.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/matchers.py
+++ vcrpy-4.0.2/vcr/matchers.py
@@ -1,6 +1,5 @@
import json
-import urllib
-import xmlrpc.client
+from six.moves import urllib, xmlrpc_client
from .util import read_body
import logging
@@ -78,7 +77,7 @@ _checker_transformer_pairs = (
lambda body: urllib.parse.parse_qs(body.decode("ascii")),
),
(_header_checker("application/json"), _transform_json),
- (lambda request: _xml_header_checker(request) and _xmlrpc_header_checker(request), xmlrpc.client.loads),
+ (lambda request: _xml_header_checker(request) and _xmlrpc_header_checker(request), xmlrpc_client.loads),
)
Index: vcrpy-4.0.2/vcr/patch.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/patch.py
+++ vcrpy-4.0.2/vcr/patch.py
@@ -1,11 +1,10 @@
"""Utilities for patching in cassettes"""
-import contextlib
import functools
import itertools
-from unittest import mock
+from .compat import contextlib, mock
from .stubs import VCRHTTPConnection, VCRHTTPSConnection
-import http.client as httplib
+from six.moves import http_client as httplib
import logging
@@ -94,7 +93,7 @@ else:
_AiohttpClientSessionRequest = aiohttp.client.ClientSession._request
-class CassettePatcherBuilder:
+class CassettePatcherBuilder(object):
def _build_patchers_from_mock_triples_decorator(function):
@functools.wraps(function)
def wrapped(self, *args, **kwargs):
@@ -359,7 +358,7 @@ class CassettePatcherBuilder:
)
-class ConnectionRemover:
+class ConnectionRemover(object):
def __init__(self, connection_class):
self._connection_class = connection_class
self._connection_pool_to_connections = {}
Index: vcrpy-4.0.2/vcr/persisters/filesystem.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/persisters/filesystem.py
+++ vcrpy-4.0.2/vcr/persisters/filesystem.py
@@ -4,13 +4,13 @@ import os
from ..serialize import serialize, deserialize
-class FilesystemPersister:
+class FilesystemPersister(object):
@classmethod
def load_cassette(cls, cassette_path, serializer):
try:
with open(cassette_path) as f:
cassette_content = f.read()
- except OSError:
+ except IOError:
raise ValueError("Cassette not found.")
cassette = deserialize(cassette_content, serializer)
return cassette
Index: vcrpy-4.0.2/vcr/request.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/request.py
+++ vcrpy-4.0.2/vcr/request.py
@@ -1,13 +1,13 @@
import warnings
-from io import BytesIO
-from urllib.parse import urlparse, parse_qsl
+from six import BytesIO, text_type
+from six.moves.urllib.parse import urlparse, parse_qsl
from .util import CaseInsensitiveDict
import logging
log = logging.getLogger(__name__)
-class Request:
+class Request(object):
"""
VCR's representation of a request.
"""
@@ -39,7 +39,7 @@ class Request:
@body.setter
def body(self, value):
- if isinstance(value, str):
+ if isinstance(value, text_type):
value = value.encode("utf-8")
self._body = value
@@ -136,4 +136,4 @@ class HeadersDict(CaseInsensitiveDict):
if old:
key = old[0]
- super().__setitem__(key, value)
+ super(HeadersDict, self).__setitem__(key, value)
Index: vcrpy-4.0.2/vcr/serializers/compat.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/serializers/compat.py
+++ vcrpy-4.0.2/vcr/serializers/compat.py
@@ -1,3 +1,6 @@
+import six
+
+
def convert_to_bytes(resp):
resp = convert_body_to_bytes(resp)
return resp
@@ -21,7 +24,7 @@ def convert_body_to_bytes(resp):
http://pyyaml.org/wiki/PyYAMLDocumentation#Python3support
"""
try:
- if resp["body"]["string"] is not None and not isinstance(resp["body"]["string"], bytes):
+ if resp["body"]["string"] is not None and not isinstance(resp["body"]["string"], six.binary_type):
resp["body"]["string"] = resp["body"]["string"].encode("utf-8")
except (KeyError, TypeError, UnicodeEncodeError):
# The thing we were converting either wasn't a dictionary or didn't
@@ -41,7 +44,7 @@ def _convert_string_to_unicode(string):
result = string
try:
- if string is not None and not isinstance(string, str):
+ if string is not None and not isinstance(string, six.text_type):
result = string.decode("utf-8")
except (TypeError, UnicodeDecodeError, AttributeError):
# Sometimes the string actually is binary or StringIO object,
Index: vcrpy-4.0.2/vcr/stubs/__init__.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/stubs/__init__.py
+++ vcrpy-4.0.2/vcr/stubs/__init__.py
@@ -1,12 +1,9 @@
"""Stubs for patching HTTP and HTTPS requests"""
import logging
-from http.client import (
- HTTPConnection,
- HTTPSConnection,
- HTTPResponse,
-)
-from io import BytesIO
+import six
+from six.moves.http_client import HTTPConnection, HTTPSConnection, HTTPResponse
+from six import BytesIO
from vcr.request import Request
from vcr.errors import CannotOverwriteExistingCassetteException
from . import compat
@@ -14,7 +11,7 @@ from . import compat
log = logging.getLogger(__name__)
-class VCRFakeSocket:
+class VCRFakeSocket(object):
"""
A socket that doesn't do anything!
Used when playing back cassettes, when there
@@ -146,7 +143,7 @@ class VCRHTTPResponse(HTTPResponse):
return self._content.readable()
-class VCRConnection:
+class VCRConnection(object):
# A reference to the cassette that's currently being patched in
cassette = None
@@ -299,7 +296,8 @@ class VCRConnection:
self.real_connection.sock = value
def __init__(self, *args, **kwargs):
- kwargs.pop("strict", None) # apparently this is gone in py3
+ if six.PY3:
+ kwargs.pop("strict", None) # apparently this is gone in py3
# need to temporarily reset here because the real connection
# inherits from the thing that we are mocking out. Take out
@@ -330,7 +328,7 @@ class VCRConnection:
# we're setting the real_connection itself for the first time
pass
- super().__setattr__(name, value)
+ super(VCRConnection, self).__setattr__(name, value)
def __getattr__(self, name):
"""
@@ -342,7 +340,7 @@ class VCRConnection:
# we're setting the real_connection itself for the first time
return getattr(self.real_connection, name)
- return super().__getattr__(name)
+ return super(VCRConnection, self).__getattr__(name)
for k, v in HTTPConnection.__dict__.items():
Index: vcrpy-4.0.2/vcr/stubs/aiohttp_stubs/__init__.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/stubs/aiohttp_stubs/__init__.py
+++ vcrpy-4.0.2/vcr/stubs/aiohttp_stubs/__init__.py
@@ -1,4 +1,6 @@
"""Stubs for aiohttp HTTP clients"""
+from __future__ import absolute_import
+
import asyncio
import functools
import logging
Index: vcrpy-4.0.2/vcr/stubs/boto3_stubs.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/stubs/boto3_stubs.py
+++ vcrpy-4.0.2/vcr/stubs/boto3_stubs.py
@@ -1,4 +1,6 @@
"""Stubs for boto3"""
+import six
+
try:
# boto using awsrequest
from botocore.awsrequest import AWSHTTPConnection as HTTPConnection
@@ -24,7 +26,8 @@ class VCRRequestsHTTPSConnection(VCRHTTP
_baseclass = VerifiedHTTPSConnection
def __init__(self, *args, **kwargs):
- kwargs.pop("strict", None)
+ if six.PY3:
+ kwargs.pop("strict", None) # apparently this is gone in py3
# need to temporarily reset here because the real connection
# inherits from the thing that we are mocking out. Take out
Index: vcrpy-4.0.2/vcr/stubs/compat.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/stubs/compat.py
+++ vcrpy-4.0.2/vcr/stubs/compat.py
@@ -1,5 +1,11 @@
-from io import BytesIO
-import http.client
+import six
+from six import BytesIO
+from six.moves.http_client import HTTPMessage
+
+try:
+ import http.client
+except ImportError:
+ pass
"""
@@ -9,7 +15,10 @@ layer that tries to cope with this move.
def get_header(message, name):
- return message.getallmatchingheaders(name)
+ if six.PY3:
+ return message.getallmatchingheaders(name)
+ else:
+ return message.getheader(name)
def get_header_items(message):
@@ -20,8 +29,16 @@ def get_header_items(message):
def get_headers(message):
for key in set(message.keys()):
- yield key, message.get_all(key)
+ if six.PY3:
+ yield key, message.get_all(key)
+ else:
+ yield key, message.getheaders(key)
def get_httpmessage(headers):
- return http.client.parse_headers(BytesIO(headers))
+ if six.PY3:
+ return http.client.parse_headers(BytesIO(headers))
+ msg = HTTPMessage(BytesIO(headers))
+ msg.fp.seek(0)
+ msg.readheaders()
+ return msg
Index: vcrpy-4.0.2/vcr/stubs/tornado_stubs.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/stubs/tornado_stubs.py
+++ vcrpy-4.0.2/vcr/stubs/tornado_stubs.py
@@ -1,6 +1,8 @@
"""Stubs for tornado HTTP clients"""
+from __future__ import absolute_import
+
import functools
-from io import BytesIO
+from six import BytesIO
from tornado import httputil
from tornado.httpclient import HTTPResponse
Index: vcrpy-4.0.2/vcr/util.py
===================================================================
--- vcrpy-4.0.2.orig/vcr/util.py
+++ vcrpy-4.0.2/vcr/util.py
@@ -107,12 +107,12 @@ def auto_decorate(decorator, predicate=l
class DecorateAll(type):
def __setattr__(cls, attribute, value):
- return super().__setattr__(attribute, maybe_decorate(attribute, value))
+ return super(DecorateAll, cls).__setattr__(attribute, maybe_decorate(attribute, value))
def __new__(cls, name, bases, attributes_dict):
new_attributes_dict = {
attribute: maybe_decorate(attribute, value) for attribute, value in attributes_dict.items()
}
- return super().__new__(cls, name, bases, new_attributes_dict)
+ return super(DecorateAll, cls).__new__(cls, name, bases, new_attributes_dict)
return DecorateAll